diff options
501 files changed, 7358 insertions, 7969 deletions
diff --git a/Documentation/cgroups/cgroups.txt b/Documentation/cgroups/cgroups.txt index 455d4e6d346d..0b33bfe7dde9 100644 --- a/Documentation/cgroups/cgroups.txt +++ b/Documentation/cgroups/cgroups.txt | |||
| @@ -227,7 +227,14 @@ as the path relative to the root of the cgroup file system. | |||
| 227 | Each cgroup is represented by a directory in the cgroup file system | 227 | Each cgroup is represented by a directory in the cgroup file system |
| 228 | containing the following files describing that cgroup: | 228 | containing the following files describing that cgroup: |
| 229 | 229 | ||
| 230 | - tasks: list of tasks (by pid) attached to that cgroup | 230 | - tasks: list of tasks (by pid) attached to that cgroup. This list |
| 231 | is not guaranteed to be sorted. Writing a thread id into this file | ||
| 232 | moves the thread into this cgroup. | ||
| 233 | - cgroup.procs: list of tgids in the cgroup. This list is not | ||
| 234 | guaranteed to be sorted or free of duplicate tgids, and userspace | ||
| 235 | should sort/uniquify the list if this property is required. | ||
| 236 | Writing a tgid into this file moves all threads with that tgid into | ||
| 237 | this cgroup. | ||
| 231 | - notify_on_release flag: run the release agent on exit? | 238 | - notify_on_release flag: run the release agent on exit? |
| 232 | - release_agent: the path to use for release notifications (this file | 239 | - release_agent: the path to use for release notifications (this file |
| 233 | exists in the top cgroup only) | 240 | exists in the top cgroup only) |
| @@ -374,7 +381,7 @@ Now you want to do something with this cgroup. | |||
| 374 | 381 | ||
| 375 | In this directory you can find several files: | 382 | In this directory you can find several files: |
| 376 | # ls | 383 | # ls |
| 377 | notify_on_release tasks | 384 | cgroup.procs notify_on_release tasks |
| 378 | (plus whatever files added by the attached subsystems) | 385 | (plus whatever files added by the attached subsystems) |
| 379 | 386 | ||
| 380 | Now attach your shell to this cgroup: | 387 | Now attach your shell to this cgroup: |
diff --git a/Documentation/isdn/INTERFACE.CAPI b/Documentation/isdn/INTERFACE.CAPI index 686e107923ec..5fe8de5cc727 100644 --- a/Documentation/isdn/INTERFACE.CAPI +++ b/Documentation/isdn/INTERFACE.CAPI | |||
| @@ -60,10 +60,9 @@ open() operation on regular files or character devices. | |||
| 60 | 60 | ||
| 61 | After a successful return from register_appl(), CAPI messages from the | 61 | After a successful return from register_appl(), CAPI messages from the |
| 62 | application may be passed to the driver for the device via calls to the | 62 | application may be passed to the driver for the device via calls to the |
| 63 | send_message() callback function. The CAPI message to send is stored in the | 63 | send_message() callback function. Conversely, the driver may call Kernel |
| 64 | data portion of an skb. Conversely, the driver may call Kernel CAPI's | 64 | CAPI's capi_ctr_handle_message() function to pass a received CAPI message to |
| 65 | capi_ctr_handle_message() function to pass a received CAPI message to Kernel | 65 | Kernel CAPI for forwarding to an application, specifying its ApplID. |
| 66 | CAPI for forwarding to an application, specifying its ApplID. | ||
| 67 | 66 | ||
| 68 | Deregistration requests (CAPI operation CAPI_RELEASE) from applications are | 67 | Deregistration requests (CAPI operation CAPI_RELEASE) from applications are |
| 69 | forwarded as calls to the release_appl() callback function, passing the same | 68 | forwarded as calls to the release_appl() callback function, passing the same |
| @@ -142,6 +141,7 @@ u16 (*send_message)(struct capi_ctr *ctrlr, struct sk_buff *skb) | |||
| 142 | to accepting or queueing the message. Errors occurring during the | 141 | to accepting or queueing the message. Errors occurring during the |
| 143 | actual processing of the message should be signaled with an | 142 | actual processing of the message should be signaled with an |
| 144 | appropriate reply message. | 143 | appropriate reply message. |
| 144 | May be called in process or interrupt context. | ||
| 145 | Calls to this function are not serialized by Kernel CAPI, ie. it must | 145 | Calls to this function are not serialized by Kernel CAPI, ie. it must |
| 146 | be prepared to be re-entered. | 146 | be prepared to be re-entered. |
| 147 | 147 | ||
| @@ -154,7 +154,8 @@ read_proc_t *ctr_read_proc | |||
| 154 | system entry, /proc/capi/controllers/<n>; will be called with a | 154 | system entry, /proc/capi/controllers/<n>; will be called with a |
| 155 | pointer to the device's capi_ctr structure as the last (data) argument | 155 | pointer to the device's capi_ctr structure as the last (data) argument |
| 156 | 156 | ||
| 157 | Note: Callback functions are never called in interrupt context. | 157 | Note: Callback functions except send_message() are never called in interrupt |
| 158 | context. | ||
| 158 | 159 | ||
| 159 | - to be filled in before calling capi_ctr_ready(): | 160 | - to be filled in before calling capi_ctr_ready(): |
| 160 | 161 | ||
| @@ -171,14 +172,40 @@ u8 serial[CAPI_SERIAL_LEN] | |||
| 171 | value to return for CAPI_GET_SERIAL | 172 | value to return for CAPI_GET_SERIAL |
| 172 | 173 | ||
| 173 | 174 | ||
| 174 | 4.3 The _cmsg Structure | 175 | 4.3 SKBs |
| 176 | |||
| 177 | CAPI messages are passed between Kernel CAPI and the driver via send_message() | ||
| 178 | and capi_ctr_handle_message(), stored in the data portion of a socket buffer | ||
| 179 | (skb). Each skb contains a single CAPI message coded according to the CAPI 2.0 | ||
| 180 | standard. | ||
| 181 | |||
| 182 | For the data transfer messages, DATA_B3_REQ and DATA_B3_IND, the actual | ||
| 183 | payload data immediately follows the CAPI message itself within the same skb. | ||
| 184 | The Data and Data64 parameters are not used for processing. The Data64 | ||
| 185 | parameter may be omitted by setting the length field of the CAPI message to 22 | ||
| 186 | instead of 30. | ||
| 187 | |||
| 188 | |||
| 189 | 4.4 The _cmsg Structure | ||
| 175 | 190 | ||
| 176 | (declared in <linux/isdn/capiutil.h>) | 191 | (declared in <linux/isdn/capiutil.h>) |
| 177 | 192 | ||
| 178 | The _cmsg structure stores the contents of a CAPI 2.0 message in an easily | 193 | The _cmsg structure stores the contents of a CAPI 2.0 message in an easily |
| 179 | accessible form. It contains members for all possible CAPI 2.0 parameters, of | 194 | accessible form. It contains members for all possible CAPI 2.0 parameters, |
| 180 | which only those appearing in the message type currently being processed are | 195 | including subparameters of the Additional Info and B Protocol structured |
| 181 | actually used. Unused members should be set to zero. | 196 | parameters, with the following exceptions: |
| 197 | |||
| 198 | * second Calling party number (CONNECT_IND) | ||
| 199 | |||
| 200 | * Data64 (DATA_B3_REQ and DATA_B3_IND) | ||
| 201 | |||
| 202 | * Sending complete (subparameter of Additional Info, CONNECT_REQ and INFO_REQ) | ||
| 203 | |||
| 204 | * Global Configuration (subparameter of B Protocol, CONNECT_REQ, CONNECT_RESP | ||
| 205 | and SELECT_B_PROTOCOL_REQ) | ||
| 206 | |||
| 207 | Only those parameters appearing in the message type currently being processed | ||
| 208 | are actually used. Unused members should be set to zero. | ||
| 182 | 209 | ||
| 183 | Members are named after the CAPI 2.0 standard names of the parameters they | 210 | Members are named after the CAPI 2.0 standard names of the parameters they |
| 184 | represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data | 211 | represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data |
| @@ -190,18 +217,19 @@ u16 for CAPI parameters of type 'word' | |||
| 190 | 217 | ||
| 191 | u32 for CAPI parameters of type 'dword' | 218 | u32 for CAPI parameters of type 'dword' |
| 192 | 219 | ||
| 193 | _cstruct for CAPI parameters of type 'struct' not containing any | 220 | _cstruct for CAPI parameters of type 'struct' |
| 194 | variably-sized (struct) subparameters (eg. 'Called Party Number') | ||
| 195 | The member is a pointer to a buffer containing the parameter in | 221 | The member is a pointer to a buffer containing the parameter in |
| 196 | CAPI encoding (length + content). It may also be NULL, which will | 222 | CAPI encoding (length + content). It may also be NULL, which will |
| 197 | be taken to represent an empty (zero length) parameter. | 223 | be taken to represent an empty (zero length) parameter. |
| 224 | Subparameters are stored in encoded form within the content part. | ||
| 198 | 225 | ||
| 199 | _cmstruct for CAPI parameters of type 'struct' containing 'struct' | 226 | _cmstruct alternative representation for CAPI parameters of type 'struct' |
| 200 | subparameters ('Additional Info' and 'B Protocol') | 227 | (used only for the 'Additional Info' and 'B Protocol' parameters) |
| 201 | The representation is a single byte containing one of the values: | 228 | The representation is a single byte containing one of the values: |
| 202 | CAPI_DEFAULT: the parameter is empty | 229 | CAPI_DEFAULT: The parameter is empty/absent. |
| 203 | CAPI_COMPOSE: the values of the subparameters are stored | 230 | CAPI_COMPOSE: The parameter is present. |
| 204 | individually in the corresponding _cmsg structure members | 231 | Subparameter values are stored individually in the corresponding |
| 232 | _cmsg structure members. | ||
| 205 | 233 | ||
| 206 | Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert | 234 | Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert |
| 207 | messages between their transport encoding described in the CAPI 2.0 standard | 235 | messages between their transport encoding described in the CAPI 2.0 standard |
| @@ -297,3 +325,26 @@ char *capi_cmd2str(u8 Command, u8 Subcommand) | |||
| 297 | be NULL if the command/subcommand is not one of those defined in the | 325 | be NULL if the command/subcommand is not one of those defined in the |
| 298 | CAPI 2.0 standard. | 326 | CAPI 2.0 standard. |
| 299 | 327 | ||
| 328 | |||
| 329 | 7. Debugging | ||
| 330 | |||
| 331 | The module kernelcapi has a module parameter showcapimsgs controlling some | ||
| 332 | debugging output produced by the module. It can only be set when the module is | ||
| 333 | loaded, via a parameter "showcapimsgs=<n>" to the modprobe command, either on | ||
| 334 | the command line or in the configuration file. | ||
| 335 | |||
| 336 | If the lowest bit of showcapimsgs is set, kernelcapi logs controller and | ||
| 337 | application up and down events. | ||
| 338 | |||
| 339 | In addition, every registered CAPI controller has an associated traceflag | ||
| 340 | parameter controlling how CAPI messages sent from and to tha controller are | ||
| 341 | logged. The traceflag parameter is initialized with the value of the | ||
| 342 | showcapimsgs parameter when the controller is registered, but can later be | ||
| 343 | changed via the MANUFACTURER_REQ command KCAPI_CMD_TRACE. | ||
| 344 | |||
| 345 | If the value of traceflag is non-zero, CAPI messages are logged. | ||
| 346 | DATA_B3 messages are only logged if the value of traceflag is > 2. | ||
| 347 | |||
| 348 | If the lowest bit of traceflag is set, only the command/subcommand and message | ||
| 349 | length are logged. Otherwise, kernelcapi logs a readable representation of | ||
| 350 | the entire message. | ||
diff --git a/Documentation/networking/pktgen.txt b/Documentation/networking/pktgen.txt index c6cf4a3c16e0..61bb645d50e0 100644 --- a/Documentation/networking/pktgen.txt +++ b/Documentation/networking/pktgen.txt | |||
| @@ -90,6 +90,11 @@ Examples: | |||
| 90 | pgset "dstmac 00:00:00:00:00:00" sets MAC destination address | 90 | pgset "dstmac 00:00:00:00:00:00" sets MAC destination address |
| 91 | pgset "srcmac 00:00:00:00:00:00" sets MAC source address | 91 | pgset "srcmac 00:00:00:00:00:00" sets MAC source address |
| 92 | 92 | ||
| 93 | pgset "queue_map_min 0" Sets the min value of tx queue interval | ||
| 94 | pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices | ||
| 95 | To select queue 1 of a given device, | ||
| 96 | use queue_map_min=1 and queue_map_max=1 | ||
| 97 | |||
| 93 | pgset "src_mac_count 1" Sets the number of MACs we'll range through. | 98 | pgset "src_mac_count 1" Sets the number of MACs we'll range through. |
| 94 | The 'minimum' MAC is what you set with srcmac. | 99 | The 'minimum' MAC is what you set with srcmac. |
| 95 | 100 | ||
| @@ -101,6 +106,9 @@ Examples: | |||
| 101 | IPDST_RND, UDPSRC_RND, | 106 | IPDST_RND, UDPSRC_RND, |
| 102 | UDPDST_RND, MACSRC_RND, MACDST_RND | 107 | UDPDST_RND, MACSRC_RND, MACDST_RND |
| 103 | MPLS_RND, VID_RND, SVID_RND | 108 | MPLS_RND, VID_RND, SVID_RND |
| 109 | QUEUE_MAP_RND # queue map random | ||
| 110 | QUEUE_MAP_CPU # queue map mirrors smp_processor_id() | ||
| 111 | |||
| 104 | 112 | ||
| 105 | pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then | 113 | pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then |
| 106 | cycle through the port range. | 114 | cycle through the port range. |
diff --git a/Documentation/vm/ksm.txt b/Documentation/vm/ksm.txt index 72a22f65960e..262d8e6793a3 100644 --- a/Documentation/vm/ksm.txt +++ b/Documentation/vm/ksm.txt | |||
| @@ -52,15 +52,15 @@ The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/, | |||
| 52 | readable by all but writable only by root: | 52 | readable by all but writable only by root: |
| 53 | 53 | ||
| 54 | max_kernel_pages - set to maximum number of kernel pages that KSM may use | 54 | max_kernel_pages - set to maximum number of kernel pages that KSM may use |
| 55 | e.g. "echo 2000 > /sys/kernel/mm/ksm/max_kernel_pages" | 55 | e.g. "echo 100000 > /sys/kernel/mm/ksm/max_kernel_pages" |
| 56 | Value 0 imposes no limit on the kernel pages KSM may use; | 56 | Value 0 imposes no limit on the kernel pages KSM may use; |
| 57 | but note that any process using MADV_MERGEABLE can cause | 57 | but note that any process using MADV_MERGEABLE can cause |
| 58 | KSM to allocate these pages, unswappable until it exits. | 58 | KSM to allocate these pages, unswappable until it exits. |
| 59 | Default: 2000 (chosen for demonstration purposes) | 59 | Default: quarter of memory (chosen to not pin too much) |
| 60 | 60 | ||
| 61 | pages_to_scan - how many present pages to scan before ksmd goes to sleep | 61 | pages_to_scan - how many present pages to scan before ksmd goes to sleep |
| 62 | e.g. "echo 200 > /sys/kernel/mm/ksm/pages_to_scan" | 62 | e.g. "echo 100 > /sys/kernel/mm/ksm/pages_to_scan" |
| 63 | Default: 200 (chosen for demonstration purposes) | 63 | Default: 100 (chosen for demonstration purposes) |
| 64 | 64 | ||
| 65 | sleep_millisecs - how many milliseconds ksmd should sleep before next scan | 65 | sleep_millisecs - how many milliseconds ksmd should sleep before next scan |
| 66 | e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs" | 66 | e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs" |
| @@ -70,7 +70,8 @@ run - set 0 to stop ksmd from running but keep merged pages, | |||
| 70 | set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run", | 70 | set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run", |
| 71 | set 2 to stop ksmd and unmerge all pages currently merged, | 71 | set 2 to stop ksmd and unmerge all pages currently merged, |
| 72 | but leave mergeable areas registered for next run | 72 | but leave mergeable areas registered for next run |
| 73 | Default: 1 (for immediate use by apps which register) | 73 | Default: 0 (must be changed to 1 to activate KSM, |
| 74 | except if CONFIG_SYSFS is disabled) | ||
| 74 | 75 | ||
| 75 | The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/: | 76 | The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/: |
| 76 | 77 | ||
| @@ -86,4 +87,4 @@ pages_volatile embraces several different kinds of activity, but a high | |||
| 86 | proportion there would also indicate poor use of madvise MADV_MERGEABLE. | 87 | proportion there would also indicate poor use of madvise MADV_MERGEABLE. |
| 87 | 88 | ||
| 88 | Izik Eidus, | 89 | Izik Eidus, |
| 89 | Hugh Dickins, 30 July 2009 | 90 | Hugh Dickins, 24 Sept 2009 |
diff --git a/Documentation/vm/page-types.c b/Documentation/vm/page-types.c index fa1a30d9e9d5..3ec4f2a22585 100644 --- a/Documentation/vm/page-types.c +++ b/Documentation/vm/page-types.c | |||
| @@ -2,7 +2,10 @@ | |||
| 2 | * page-types: Tool for querying page flags | 2 | * page-types: Tool for querying page flags |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2009 Intel corporation | 4 | * Copyright (C) 2009 Intel corporation |
| 5 | * Copyright (C) 2009 Wu Fengguang <fengguang.wu@intel.com> | 5 | * |
| 6 | * Authors: Wu Fengguang <fengguang.wu@intel.com> | ||
| 7 | * | ||
| 8 | * Released under the General Public License (GPL). | ||
| 6 | */ | 9 | */ |
| 7 | 10 | ||
| 8 | #define _LARGEFILE64_SOURCE | 11 | #define _LARGEFILE64_SOURCE |
| @@ -69,7 +72,9 @@ | |||
| 69 | #define KPF_COMPOUND_TAIL 16 | 72 | #define KPF_COMPOUND_TAIL 16 |
| 70 | #define KPF_HUGE 17 | 73 | #define KPF_HUGE 17 |
| 71 | #define KPF_UNEVICTABLE 18 | 74 | #define KPF_UNEVICTABLE 18 |
| 75 | #define KPF_HWPOISON 19 | ||
| 72 | #define KPF_NOPAGE 20 | 76 | #define KPF_NOPAGE 20 |
| 77 | #define KPF_KSM 21 | ||
| 73 | 78 | ||
| 74 | /* [32-] kernel hacking assistances */ | 79 | /* [32-] kernel hacking assistances */ |
| 75 | #define KPF_RESERVED 32 | 80 | #define KPF_RESERVED 32 |
| @@ -116,7 +121,9 @@ static char *page_flag_names[] = { | |||
| 116 | [KPF_COMPOUND_TAIL] = "T:compound_tail", | 121 | [KPF_COMPOUND_TAIL] = "T:compound_tail", |
| 117 | [KPF_HUGE] = "G:huge", | 122 | [KPF_HUGE] = "G:huge", |
| 118 | [KPF_UNEVICTABLE] = "u:unevictable", | 123 | [KPF_UNEVICTABLE] = "u:unevictable", |
| 124 | [KPF_HWPOISON] = "X:hwpoison", | ||
| 119 | [KPF_NOPAGE] = "n:nopage", | 125 | [KPF_NOPAGE] = "n:nopage", |
| 126 | [KPF_KSM] = "x:ksm", | ||
| 120 | 127 | ||
| 121 | [KPF_RESERVED] = "r:reserved", | 128 | [KPF_RESERVED] = "r:reserved", |
| 122 | [KPF_MLOCKED] = "m:mlocked", | 129 | [KPF_MLOCKED] = "m:mlocked", |
| @@ -152,9 +159,6 @@ static unsigned long opt_size[MAX_ADDR_RANGES]; | |||
| 152 | static int nr_vmas; | 159 | static int nr_vmas; |
| 153 | static unsigned long pg_start[MAX_VMAS]; | 160 | static unsigned long pg_start[MAX_VMAS]; |
| 154 | static unsigned long pg_end[MAX_VMAS]; | 161 | static unsigned long pg_end[MAX_VMAS]; |
| 155 | static unsigned long voffset; | ||
| 156 | |||
| 157 | static int pagemap_fd; | ||
| 158 | 162 | ||
| 159 | #define MAX_BIT_FILTERS 64 | 163 | #define MAX_BIT_FILTERS 64 |
| 160 | static int nr_bit_filters; | 164 | static int nr_bit_filters; |
| @@ -163,9 +167,16 @@ static uint64_t opt_bits[MAX_BIT_FILTERS]; | |||
| 163 | 167 | ||
| 164 | static int page_size; | 168 | static int page_size; |
| 165 | 169 | ||
| 166 | #define PAGES_BATCH (64 << 10) /* 64k pages */ | 170 | static int pagemap_fd; |
| 167 | static int kpageflags_fd; | 171 | static int kpageflags_fd; |
| 168 | 172 | ||
| 173 | static int opt_hwpoison; | ||
| 174 | static int opt_unpoison; | ||
| 175 | |||
| 176 | static char *hwpoison_debug_fs = "/debug/hwpoison"; | ||
| 177 | static int hwpoison_inject_fd; | ||
| 178 | static int hwpoison_forget_fd; | ||
| 179 | |||
| 169 | #define HASH_SHIFT 13 | 180 | #define HASH_SHIFT 13 |
| 170 | #define HASH_SIZE (1 << HASH_SHIFT) | 181 | #define HASH_SIZE (1 << HASH_SHIFT) |
| 171 | #define HASH_MASK (HASH_SIZE - 1) | 182 | #define HASH_MASK (HASH_SIZE - 1) |
| @@ -207,6 +218,74 @@ static void fatal(const char *x, ...) | |||
| 207 | exit(EXIT_FAILURE); | 218 | exit(EXIT_FAILURE); |
| 208 | } | 219 | } |
| 209 | 220 | ||
| 221 | int checked_open(const char *pathname, int flags) | ||
| 222 | { | ||
| 223 | int fd = open(pathname, flags); | ||
| 224 | |||
| 225 | if (fd < 0) { | ||
| 226 | perror(pathname); | ||
| 227 | exit(EXIT_FAILURE); | ||
| 228 | } | ||
| 229 | |||
| 230 | return fd; | ||
| 231 | } | ||
| 232 | |||
| 233 | /* | ||
| 234 | * pagemap/kpageflags routines | ||
| 235 | */ | ||
| 236 | |||
| 237 | static unsigned long do_u64_read(int fd, char *name, | ||
| 238 | uint64_t *buf, | ||
| 239 | unsigned long index, | ||
| 240 | unsigned long count) | ||
| 241 | { | ||
| 242 | long bytes; | ||
| 243 | |||
| 244 | if (index > ULONG_MAX / 8) | ||
| 245 | fatal("index overflow: %lu\n", index); | ||
| 246 | |||
| 247 | if (lseek(fd, index * 8, SEEK_SET) < 0) { | ||
| 248 | perror(name); | ||
| 249 | exit(EXIT_FAILURE); | ||
| 250 | } | ||
| 251 | |||
| 252 | bytes = read(fd, buf, count * 8); | ||
| 253 | if (bytes < 0) { | ||
| 254 | perror(name); | ||
| 255 | exit(EXIT_FAILURE); | ||
| 256 | } | ||
| 257 | if (bytes % 8) | ||
| 258 | fatal("partial read: %lu bytes\n", bytes); | ||
| 259 | |||
| 260 | return bytes / 8; | ||
| 261 | } | ||
| 262 | |||
| 263 | static unsigned long kpageflags_read(uint64_t *buf, | ||
| 264 | unsigned long index, | ||
| 265 | unsigned long pages) | ||
| 266 | { | ||
| 267 | return do_u64_read(kpageflags_fd, PROC_KPAGEFLAGS, buf, index, pages); | ||
| 268 | } | ||
| 269 | |||
| 270 | static unsigned long pagemap_read(uint64_t *buf, | ||
| 271 | unsigned long index, | ||
| 272 | unsigned long pages) | ||
| 273 | { | ||
| 274 | return do_u64_read(pagemap_fd, "/proc/pid/pagemap", buf, index, pages); | ||
| 275 | } | ||
| 276 | |||
| 277 | static unsigned long pagemap_pfn(uint64_t val) | ||
| 278 | { | ||
| 279 | unsigned long pfn; | ||
| 280 | |||
| 281 | if (val & PM_PRESENT) | ||
| 282 | pfn = PM_PFRAME(val); | ||
| 283 | else | ||
| 284 | pfn = 0; | ||
| 285 | |||
| 286 | return pfn; | ||
| 287 | } | ||
| 288 | |||
| 210 | 289 | ||
| 211 | /* | 290 | /* |
| 212 | * page flag names | 291 | * page flag names |
| @@ -255,7 +334,8 @@ static char *page_flag_longname(uint64_t flags) | |||
| 255 | * page list and summary | 334 | * page list and summary |
| 256 | */ | 335 | */ |
| 257 | 336 | ||
| 258 | static void show_page_range(unsigned long offset, uint64_t flags) | 337 | static void show_page_range(unsigned long voffset, |
| 338 | unsigned long offset, uint64_t flags) | ||
| 259 | { | 339 | { |
| 260 | static uint64_t flags0; | 340 | static uint64_t flags0; |
| 261 | static unsigned long voff; | 341 | static unsigned long voff; |
| @@ -281,7 +361,8 @@ static void show_page_range(unsigned long offset, uint64_t flags) | |||
| 281 | count = 1; | 361 | count = 1; |
| 282 | } | 362 | } |
| 283 | 363 | ||
| 284 | static void show_page(unsigned long offset, uint64_t flags) | 364 | static void show_page(unsigned long voffset, |
| 365 | unsigned long offset, uint64_t flags) | ||
| 285 | { | 366 | { |
| 286 | if (opt_pid) | 367 | if (opt_pid) |
| 287 | printf("%lx\t", voffset); | 368 | printf("%lx\t", voffset); |
| @@ -362,6 +443,62 @@ static uint64_t well_known_flags(uint64_t flags) | |||
| 362 | return flags; | 443 | return flags; |
| 363 | } | 444 | } |
| 364 | 445 | ||
| 446 | static uint64_t kpageflags_flags(uint64_t flags) | ||
| 447 | { | ||
| 448 | flags = expand_overloaded_flags(flags); | ||
| 449 | |||
| 450 | if (!opt_raw) | ||
| 451 | flags = well_known_flags(flags); | ||
| 452 | |||
| 453 | return flags; | ||
| 454 | } | ||
| 455 | |||
| 456 | /* | ||
| 457 | * page actions | ||
| 458 | */ | ||
| 459 | |||
| 460 | static void prepare_hwpoison_fd(void) | ||
| 461 | { | ||
| 462 | char buf[100]; | ||
| 463 | |||
| 464 | if (opt_hwpoison && !hwpoison_inject_fd) { | ||
| 465 | sprintf(buf, "%s/corrupt-pfn", hwpoison_debug_fs); | ||
| 466 | hwpoison_inject_fd = checked_open(buf, O_WRONLY); | ||
| 467 | } | ||
| 468 | |||
| 469 | if (opt_unpoison && !hwpoison_forget_fd) { | ||
| 470 | sprintf(buf, "%s/renew-pfn", hwpoison_debug_fs); | ||
| 471 | hwpoison_forget_fd = checked_open(buf, O_WRONLY); | ||
| 472 | } | ||
| 473 | } | ||
| 474 | |||
| 475 | static int hwpoison_page(unsigned long offset) | ||
| 476 | { | ||
| 477 | char buf[100]; | ||
| 478 | int len; | ||
| 479 | |||
| 480 | len = sprintf(buf, "0x%lx\n", offset); | ||
| 481 | len = write(hwpoison_inject_fd, buf, len); | ||
| 482 | if (len < 0) { | ||
| 483 | perror("hwpoison inject"); | ||
| 484 | return len; | ||
| 485 | } | ||
| 486 | return 0; | ||
| 487 | } | ||
| 488 | |||
| 489 | static int unpoison_page(unsigned long offset) | ||
| 490 | { | ||
| 491 | char buf[100]; | ||
| 492 | int len; | ||
| 493 | |||
| 494 | len = sprintf(buf, "0x%lx\n", offset); | ||
| 495 | len = write(hwpoison_forget_fd, buf, len); | ||
| 496 | if (len < 0) { | ||
| 497 | perror("hwpoison forget"); | ||
| 498 | return len; | ||
| 499 | } | ||
| 500 | return 0; | ||
| 501 | } | ||
| 365 | 502 | ||
| 366 | /* | 503 | /* |
| 367 | * page frame walker | 504 | * page frame walker |
| @@ -394,104 +531,83 @@ static int hash_slot(uint64_t flags) | |||
| 394 | exit(EXIT_FAILURE); | 531 | exit(EXIT_FAILURE); |
| 395 | } | 532 | } |
| 396 | 533 | ||
| 397 | static void add_page(unsigned long offset, uint64_t flags) | 534 | static void add_page(unsigned long voffset, |
| 535 | unsigned long offset, uint64_t flags) | ||
| 398 | { | 536 | { |
| 399 | flags = expand_overloaded_flags(flags); | 537 | flags = kpageflags_flags(flags); |
| 400 | |||
| 401 | if (!opt_raw) | ||
| 402 | flags = well_known_flags(flags); | ||
| 403 | 538 | ||
| 404 | if (!bit_mask_ok(flags)) | 539 | if (!bit_mask_ok(flags)) |
| 405 | return; | 540 | return; |
| 406 | 541 | ||
| 542 | if (opt_hwpoison) | ||
| 543 | hwpoison_page(offset); | ||
| 544 | if (opt_unpoison) | ||
| 545 | unpoison_page(offset); | ||
| 546 | |||
| 407 | if (opt_list == 1) | 547 | if (opt_list == 1) |
| 408 | show_page_range(offset, flags); | 548 | show_page_range(voffset, offset, flags); |
| 409 | else if (opt_list == 2) | 549 | else if (opt_list == 2) |
| 410 | show_page(offset, flags); | 550 | show_page(voffset, offset, flags); |
| 411 | 551 | ||
| 412 | nr_pages[hash_slot(flags)]++; | 552 | nr_pages[hash_slot(flags)]++; |
| 413 | total_pages++; | 553 | total_pages++; |
| 414 | } | 554 | } |
| 415 | 555 | ||
| 416 | static void walk_pfn(unsigned long index, unsigned long count) | 556 | #define KPAGEFLAGS_BATCH (64 << 10) /* 64k pages */ |
| 557 | static void walk_pfn(unsigned long voffset, | ||
| 558 | unsigned long index, | ||
| 559 | unsigned long count) | ||
| 417 | { | 560 | { |
| 561 | uint64_t buf[KPAGEFLAGS_BATCH]; | ||
| 418 | unsigned long batch; | 562 | unsigned long batch; |
| 419 | unsigned long n; | 563 | unsigned long pages; |
| 420 | unsigned long i; | 564 | unsigned long i; |
| 421 | 565 | ||
| 422 | if (index > ULONG_MAX / KPF_BYTES) | ||
| 423 | fatal("index overflow: %lu\n", index); | ||
| 424 | |||
| 425 | lseek(kpageflags_fd, index * KPF_BYTES, SEEK_SET); | ||
| 426 | |||
| 427 | while (count) { | 566 | while (count) { |
| 428 | uint64_t kpageflags_buf[KPF_BYTES * PAGES_BATCH]; | 567 | batch = min_t(unsigned long, count, KPAGEFLAGS_BATCH); |
| 429 | 568 | pages = kpageflags_read(buf, index, batch); | |
| 430 | batch = min_t(unsigned long, count, PAGES_BATCH); | 569 | if (pages == 0) |
| 431 | n = read(kpageflags_fd, kpageflags_buf, batch * KPF_BYTES); | ||
| 432 | if (n == 0) | ||
| 433 | break; | 570 | break; |
| 434 | if (n < 0) { | ||
| 435 | perror(PROC_KPAGEFLAGS); | ||
| 436 | exit(EXIT_FAILURE); | ||
| 437 | } | ||
| 438 | 571 | ||
| 439 | if (n % KPF_BYTES != 0) | 572 | for (i = 0; i < pages; i++) |
| 440 | fatal("partial read: %lu bytes\n", n); | 573 | add_page(voffset + i, index + i, buf[i]); |
| 441 | n = n / KPF_BYTES; | ||
| 442 | 574 | ||
| 443 | for (i = 0; i < n; i++) | 575 | index += pages; |
| 444 | add_page(index + i, kpageflags_buf[i]); | 576 | count -= pages; |
| 445 | |||
| 446 | index += batch; | ||
| 447 | count -= batch; | ||
| 448 | } | 577 | } |
| 449 | } | 578 | } |
| 450 | 579 | ||
| 451 | 580 | #define PAGEMAP_BATCH (64 << 10) | |
| 452 | #define PAGEMAP_BATCH 4096 | 581 | static void walk_vma(unsigned long index, unsigned long count) |
| 453 | static unsigned long task_pfn(unsigned long pgoff) | ||
| 454 | { | 582 | { |
| 455 | static uint64_t buf[PAGEMAP_BATCH]; | 583 | uint64_t buf[PAGEMAP_BATCH]; |
| 456 | static unsigned long start; | 584 | unsigned long batch; |
| 457 | static long count; | 585 | unsigned long pages; |
| 458 | uint64_t pfn; | 586 | unsigned long pfn; |
| 587 | unsigned long i; | ||
| 459 | 588 | ||
| 460 | if (pgoff < start || pgoff >= start + count) { | 589 | while (count) { |
| 461 | if (lseek64(pagemap_fd, | 590 | batch = min_t(unsigned long, count, PAGEMAP_BATCH); |
| 462 | (uint64_t)pgoff * PM_ENTRY_BYTES, | 591 | pages = pagemap_read(buf, index, batch); |
| 463 | SEEK_SET) < 0) { | 592 | if (pages == 0) |
| 464 | perror("pagemap seek"); | 593 | break; |
| 465 | exit(EXIT_FAILURE); | ||
| 466 | } | ||
| 467 | count = read(pagemap_fd, buf, sizeof(buf)); | ||
| 468 | if (count == 0) | ||
| 469 | return 0; | ||
| 470 | if (count < 0) { | ||
| 471 | perror("pagemap read"); | ||
| 472 | exit(EXIT_FAILURE); | ||
| 473 | } | ||
| 474 | if (count % PM_ENTRY_BYTES) { | ||
| 475 | fatal("pagemap read not aligned.\n"); | ||
| 476 | exit(EXIT_FAILURE); | ||
| 477 | } | ||
| 478 | count /= PM_ENTRY_BYTES; | ||
| 479 | start = pgoff; | ||
| 480 | } | ||
| 481 | 594 | ||
| 482 | pfn = buf[pgoff - start]; | 595 | for (i = 0; i < pages; i++) { |
| 483 | if (pfn & PM_PRESENT) | 596 | pfn = pagemap_pfn(buf[i]); |
| 484 | pfn = PM_PFRAME(pfn); | 597 | if (pfn) |
| 485 | else | 598 | walk_pfn(index + i, pfn, 1); |
| 486 | pfn = 0; | 599 | } |
| 487 | 600 | ||
| 488 | return pfn; | 601 | index += pages; |
| 602 | count -= pages; | ||
| 603 | } | ||
| 489 | } | 604 | } |
| 490 | 605 | ||
| 491 | static void walk_task(unsigned long index, unsigned long count) | 606 | static void walk_task(unsigned long index, unsigned long count) |
| 492 | { | 607 | { |
| 493 | int i = 0; | ||
| 494 | const unsigned long end = index + count; | 608 | const unsigned long end = index + count; |
| 609 | unsigned long start; | ||
| 610 | int i = 0; | ||
| 495 | 611 | ||
| 496 | while (index < end) { | 612 | while (index < end) { |
| 497 | 613 | ||
| @@ -501,15 +617,11 @@ static void walk_task(unsigned long index, unsigned long count) | |||
| 501 | if (pg_start[i] >= end) | 617 | if (pg_start[i] >= end) |
| 502 | return; | 618 | return; |
| 503 | 619 | ||
| 504 | voffset = max_t(unsigned long, pg_start[i], index); | 620 | start = max_t(unsigned long, pg_start[i], index); |
| 505 | index = min_t(unsigned long, pg_end[i], end); | 621 | index = min_t(unsigned long, pg_end[i], end); |
| 506 | 622 | ||
| 507 | assert(voffset < index); | 623 | assert(start < index); |
| 508 | for (; voffset < index; voffset++) { | 624 | walk_vma(start, index - start); |
| 509 | unsigned long pfn = task_pfn(voffset); | ||
| 510 | if (pfn) | ||
| 511 | walk_pfn(pfn, 1); | ||
| 512 | } | ||
| 513 | } | 625 | } |
| 514 | } | 626 | } |
| 515 | 627 | ||
| @@ -527,18 +639,14 @@ static void walk_addr_ranges(void) | |||
| 527 | { | 639 | { |
| 528 | int i; | 640 | int i; |
| 529 | 641 | ||
| 530 | kpageflags_fd = open(PROC_KPAGEFLAGS, O_RDONLY); | 642 | kpageflags_fd = checked_open(PROC_KPAGEFLAGS, O_RDONLY); |
| 531 | if (kpageflags_fd < 0) { | ||
| 532 | perror(PROC_KPAGEFLAGS); | ||
| 533 | exit(EXIT_FAILURE); | ||
| 534 | } | ||
| 535 | 643 | ||
| 536 | if (!nr_addr_ranges) | 644 | if (!nr_addr_ranges) |
| 537 | add_addr_range(0, ULONG_MAX); | 645 | add_addr_range(0, ULONG_MAX); |
| 538 | 646 | ||
| 539 | for (i = 0; i < nr_addr_ranges; i++) | 647 | for (i = 0; i < nr_addr_ranges; i++) |
| 540 | if (!opt_pid) | 648 | if (!opt_pid) |
| 541 | walk_pfn(opt_offset[i], opt_size[i]); | 649 | walk_pfn(0, opt_offset[i], opt_size[i]); |
| 542 | else | 650 | else |
| 543 | walk_task(opt_offset[i], opt_size[i]); | 651 | walk_task(opt_offset[i], opt_size[i]); |
| 544 | 652 | ||
| @@ -575,6 +683,8 @@ static void usage(void) | |||
| 575 | " -l|--list Show page details in ranges\n" | 683 | " -l|--list Show page details in ranges\n" |
| 576 | " -L|--list-each Show page details one by one\n" | 684 | " -L|--list-each Show page details one by one\n" |
| 577 | " -N|--no-summary Don't show summay info\n" | 685 | " -N|--no-summary Don't show summay info\n" |
| 686 | " -X|--hwpoison hwpoison pages\n" | ||
| 687 | " -x|--unpoison unpoison pages\n" | ||
| 578 | " -h|--help Show this usage message\n" | 688 | " -h|--help Show this usage message\n" |
| 579 | "addr-spec:\n" | 689 | "addr-spec:\n" |
| 580 | " N one page at offset N (unit: pages)\n" | 690 | " N one page at offset N (unit: pages)\n" |
| @@ -624,11 +734,7 @@ static void parse_pid(const char *str) | |||
| 624 | opt_pid = parse_number(str); | 734 | opt_pid = parse_number(str); |
| 625 | 735 | ||
| 626 | sprintf(buf, "/proc/%d/pagemap", opt_pid); | 736 | sprintf(buf, "/proc/%d/pagemap", opt_pid); |
| 627 | pagemap_fd = open(buf, O_RDONLY); | 737 | pagemap_fd = checked_open(buf, O_RDONLY); |
| 628 | if (pagemap_fd < 0) { | ||
| 629 | perror(buf); | ||
| 630 | exit(EXIT_FAILURE); | ||
| 631 | } | ||
| 632 | 738 | ||
| 633 | sprintf(buf, "/proc/%d/maps", opt_pid); | 739 | sprintf(buf, "/proc/%d/maps", opt_pid); |
| 634 | file = fopen(buf, "r"); | 740 | file = fopen(buf, "r"); |
| @@ -788,6 +894,8 @@ static struct option opts[] = { | |||
| 788 | { "list" , 0, NULL, 'l' }, | 894 | { "list" , 0, NULL, 'l' }, |
| 789 | { "list-each" , 0, NULL, 'L' }, | 895 | { "list-each" , 0, NULL, 'L' }, |
| 790 | { "no-summary", 0, NULL, 'N' }, | 896 | { "no-summary", 0, NULL, 'N' }, |
| 897 | { "hwpoison" , 0, NULL, 'X' }, | ||
| 898 | { "unpoison" , 0, NULL, 'x' }, | ||
| 791 | { "help" , 0, NULL, 'h' }, | 899 | { "help" , 0, NULL, 'h' }, |
| 792 | { NULL , 0, NULL, 0 } | 900 | { NULL , 0, NULL, 0 } |
| 793 | }; | 901 | }; |
| @@ -799,7 +907,7 @@ int main(int argc, char *argv[]) | |||
| 799 | page_size = getpagesize(); | 907 | page_size = getpagesize(); |
| 800 | 908 | ||
| 801 | while ((c = getopt_long(argc, argv, | 909 | while ((c = getopt_long(argc, argv, |
| 802 | "rp:f:a:b:lLNh", opts, NULL)) != -1) { | 910 | "rp:f:a:b:lLNXxh", opts, NULL)) != -1) { |
| 803 | switch (c) { | 911 | switch (c) { |
| 804 | case 'r': | 912 | case 'r': |
| 805 | opt_raw = 1; | 913 | opt_raw = 1; |
| @@ -825,6 +933,14 @@ int main(int argc, char *argv[]) | |||
| 825 | case 'N': | 933 | case 'N': |
| 826 | opt_no_summary = 1; | 934 | opt_no_summary = 1; |
| 827 | break; | 935 | break; |
| 936 | case 'X': | ||
| 937 | opt_hwpoison = 1; | ||
| 938 | prepare_hwpoison_fd(); | ||
| 939 | break; | ||
| 940 | case 'x': | ||
| 941 | opt_unpoison = 1; | ||
| 942 | prepare_hwpoison_fd(); | ||
| 943 | break; | ||
| 828 | case 'h': | 944 | case 'h': |
| 829 | usage(); | 945 | usage(); |
| 830 | exit(0); | 946 | exit(0); |
| @@ -844,7 +960,7 @@ int main(int argc, char *argv[]) | |||
| 844 | walk_addr_ranges(); | 960 | walk_addr_ranges(); |
| 845 | 961 | ||
| 846 | if (opt_list == 1) | 962 | if (opt_list == 1) |
| 847 | show_page_range(0, 0); /* drain the buffer */ | 963 | show_page_range(0, 0, 0); /* drain the buffer */ |
| 848 | 964 | ||
| 849 | if (opt_no_summary) | 965 | if (opt_no_summary) |
| 850 | return 0; | 966 | return 0; |
diff --git a/Documentation/vm/pagemap.txt b/Documentation/vm/pagemap.txt index 600a304a828c..df09b9650a81 100644 --- a/Documentation/vm/pagemap.txt +++ b/Documentation/vm/pagemap.txt | |||
| @@ -57,7 +57,9 @@ There are three components to pagemap: | |||
| 57 | 16. COMPOUND_TAIL | 57 | 16. COMPOUND_TAIL |
| 58 | 16. HUGE | 58 | 16. HUGE |
| 59 | 18. UNEVICTABLE | 59 | 18. UNEVICTABLE |
| 60 | 19. HWPOISON | ||
| 60 | 20. NOPAGE | 61 | 20. NOPAGE |
| 62 | 21. KSM | ||
| 61 | 63 | ||
| 62 | Short descriptions to the page flags: | 64 | Short descriptions to the page flags: |
| 63 | 65 | ||
| @@ -86,9 +88,15 @@ Short descriptions to the page flags: | |||
| 86 | 17. HUGE | 88 | 17. HUGE |
| 87 | this is an integral part of a HugeTLB page | 89 | this is an integral part of a HugeTLB page |
| 88 | 90 | ||
| 91 | 19. HWPOISON | ||
| 92 | hardware detected memory corruption on this page: don't touch the data! | ||
| 93 | |||
| 89 | 20. NOPAGE | 94 | 20. NOPAGE |
| 90 | no page frame exists at the requested address | 95 | no page frame exists at the requested address |
| 91 | 96 | ||
| 97 | 21. KSM | ||
| 98 | identical memory pages dynamically shared between one or more processes | ||
| 99 | |||
| 92 | [IO related page flags] | 100 | [IO related page flags] |
| 93 | 1. ERROR IO error occurred | 101 | 1. ERROR IO error occurred |
| 94 | 3. UPTODATE page has up-to-date data | 102 | 3. UPTODATE page has up-to-date data |
diff --git a/MAINTAINERS b/MAINTAINERS index 09a2028bab7f..e1da925b38c8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3643,6 +3643,13 @@ F: Documentation/blockdev/nbd.txt | |||
| 3643 | F: drivers/block/nbd.c | 3643 | F: drivers/block/nbd.c |
| 3644 | F: include/linux/nbd.h | 3644 | F: include/linux/nbd.h |
| 3645 | 3645 | ||
| 3646 | NETWORK DROP MONITOR | ||
| 3647 | M: Neil Horman <nhorman@tuxdriver.com> | ||
| 3648 | L: netdev@vger.kernel.org | ||
| 3649 | S: Maintained | ||
| 3650 | W: https://fedorahosted.org/dropwatch/ | ||
| 3651 | F: net/core/drop_monitor.c | ||
| 3652 | |||
| 3646 | NETWORKING [GENERAL] | 3653 | NETWORKING [GENERAL] |
| 3647 | M: "David S. Miller" <davem@davemloft.net> | 3654 | M: "David S. Miller" <davem@davemloft.net> |
| 3648 | L: netdev@vger.kernel.org | 3655 | L: netdev@vger.kernel.org |
| @@ -3973,6 +3980,7 @@ F: drivers/block/paride/ | |||
| 3973 | PARISC ARCHITECTURE | 3980 | PARISC ARCHITECTURE |
| 3974 | M: Kyle McMartin <kyle@mcmartin.ca> | 3981 | M: Kyle McMartin <kyle@mcmartin.ca> |
| 3975 | M: Helge Deller <deller@gmx.de> | 3982 | M: Helge Deller <deller@gmx.de> |
| 3983 | M: "James E.J. Bottomley" <jejb@parisc-linux.org> | ||
| 3976 | L: linux-parisc@vger.kernel.org | 3984 | L: linux-parisc@vger.kernel.org |
| 3977 | W: http://www.parisc-linux.org/ | 3985 | W: http://www.parisc-linux.org/ |
| 3978 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git | 3986 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index b45ad312c587..c1af5326e92f 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
| @@ -38,49 +38,49 @@ | |||
| 38 | 38 | ||
| 39 | static int board_keymap[] = { | 39 | static int board_keymap[] = { |
| 40 | KEY(0, 0, KEY_Q), | 40 | KEY(0, 0, KEY_Q), |
| 41 | KEY(0, 1, KEY_W), | 41 | KEY(0, 1, KEY_O), |
| 42 | KEY(0, 2, KEY_E), | 42 | KEY(0, 2, KEY_P), |
| 43 | KEY(0, 3, KEY_R), | 43 | KEY(0, 3, KEY_COMMA), |
| 44 | KEY(0, 4, KEY_T), | 44 | KEY(0, 4, KEY_BACKSPACE), |
| 45 | KEY(0, 5, KEY_Y), | 45 | KEY(0, 6, KEY_A), |
| 46 | KEY(0, 6, KEY_U), | 46 | KEY(0, 7, KEY_S), |
| 47 | KEY(0, 7, KEY_I), | 47 | KEY(1, 0, KEY_W), |
| 48 | KEY(1, 0, KEY_O), | ||
| 49 | KEY(1, 1, KEY_D), | 48 | KEY(1, 1, KEY_D), |
| 50 | KEY(1, 2, KEY_DOT), | 49 | KEY(1, 2, KEY_F), |
| 51 | KEY(1, 3, KEY_V), | 50 | KEY(1, 3, KEY_G), |
| 52 | KEY(1, 4, KEY_DOWN), | 51 | KEY(1, 4, KEY_H), |
| 53 | KEY(2, 0, KEY_P), | 52 | KEY(1, 5, KEY_J), |
| 54 | KEY(2, 1, KEY_F), | 53 | KEY(1, 6, KEY_K), |
| 54 | KEY(1, 7, KEY_L), | ||
| 55 | KEY(2, 0, KEY_E), | ||
| 56 | KEY(2, 1, KEY_DOT), | ||
| 55 | KEY(2, 2, KEY_UP), | 57 | KEY(2, 2, KEY_UP), |
| 56 | KEY(2, 3, KEY_B), | 58 | KEY(2, 3, KEY_ENTER), |
| 57 | KEY(2, 4, KEY_RIGHT), | 59 | KEY(2, 5, KEY_Z), |
| 58 | KEY(3, 0, KEY_COMMA), | 60 | KEY(2, 6, KEY_X), |
| 59 | KEY(3, 1, KEY_G), | 61 | KEY(2, 7, KEY_C), |
| 60 | KEY(3, 2, KEY_ENTER), | 62 | KEY(3, 0, KEY_R), |
| 63 | KEY(3, 1, KEY_V), | ||
| 64 | KEY(3, 2, KEY_B), | ||
| 61 | KEY(3, 3, KEY_N), | 65 | KEY(3, 3, KEY_N), |
| 62 | KEY(4, 0, KEY_BACKSPACE), | 66 | KEY(3, 4, KEY_M), |
| 63 | KEY(4, 1, KEY_H), | 67 | KEY(3, 5, KEY_SPACE), |
| 64 | KEY(4, 3, KEY_M), | 68 | KEY(3, 6, KEY_SPACE), |
| 69 | KEY(3, 7, KEY_LEFT), | ||
| 70 | KEY(4, 0, KEY_T), | ||
| 71 | KEY(4, 1, KEY_DOWN), | ||
| 72 | KEY(4, 2, KEY_RIGHT), | ||
| 65 | KEY(4, 4, KEY_LEFTCTRL), | 73 | KEY(4, 4, KEY_LEFTCTRL), |
| 66 | KEY(5, 1, KEY_J), | 74 | KEY(4, 5, KEY_RIGHTALT), |
| 67 | KEY(5, 2, KEY_Z), | 75 | KEY(4, 6, KEY_LEFTSHIFT), |
| 68 | KEY(5, 3, KEY_SPACE), | 76 | KEY(5, 0, KEY_Y), |
| 69 | KEY(5, 4, KEY_LEFTSHIFT), | 77 | KEY(6, 0, KEY_U), |
| 70 | KEY(6, 0, KEY_A), | 78 | KEY(7, 0, KEY_I), |
| 71 | KEY(6, 1, KEY_K), | 79 | KEY(7, 1, KEY_F7), |
| 72 | KEY(6, 2, KEY_X), | 80 | KEY(7, 2, KEY_F8), |
| 73 | KEY(6, 3, KEY_SPACE), | 81 | KEY(0xff, 2, KEY_F9), |
| 74 | KEY(6, 4, KEY_FN), | 82 | KEY(0xff, 4, KEY_F10), |
| 75 | KEY(7, 0, KEY_S), | 83 | KEY(0xff, 5, KEY_F11), |
| 76 | KEY(7, 1, KEY_L), | ||
| 77 | KEY(7, 2, KEY_C), | ||
| 78 | KEY(7, 3, KEY_LEFT), | ||
| 79 | KEY(0xff, 0, KEY_F6), | ||
| 80 | KEY(0xff, 1, KEY_F7), | ||
| 81 | KEY(0xff, 2, KEY_F8), | ||
| 82 | KEY(0xff, 4, KEY_F9), | ||
| 83 | KEY(0xff, 5, KEY_F10), | ||
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | static struct matrix_keymap_data board_map_data = { | 86 | static struct matrix_keymap_data board_map_data = { |
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index fafcd32e6907..489556eecbd1 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
| @@ -338,6 +338,13 @@ static struct omap_clk omap34xx_clks[] = { | |||
| 338 | */ | 338 | */ |
| 339 | #define SDRC_MPURATE_LOOPS 96 | 339 | #define SDRC_MPURATE_LOOPS 96 |
| 340 | 340 | ||
| 341 | /* | ||
| 342 | * DPLL5_FREQ_FOR_USBHOST: USBHOST and USBTLL are the only clocks | ||
| 343 | * that are sourced by DPLL5, and both of these require this clock | ||
| 344 | * to be at 120 MHz for proper operation. | ||
| 345 | */ | ||
| 346 | #define DPLL5_FREQ_FOR_USBHOST 120000000 | ||
| 347 | |||
| 341 | /** | 348 | /** |
| 342 | * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI | 349 | * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI |
| 343 | * @clk: struct clk * being enabled | 350 | * @clk: struct clk * being enabled |
| @@ -1056,6 +1063,28 @@ void omap2_clk_prepare_for_reboot(void) | |||
| 1056 | #endif | 1063 | #endif |
| 1057 | } | 1064 | } |
| 1058 | 1065 | ||
| 1066 | static void omap3_clk_lock_dpll5(void) | ||
| 1067 | { | ||
| 1068 | struct clk *dpll5_clk; | ||
| 1069 | struct clk *dpll5_m2_clk; | ||
| 1070 | |||
| 1071 | dpll5_clk = clk_get(NULL, "dpll5_ck"); | ||
| 1072 | clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST); | ||
| 1073 | clk_enable(dpll5_clk); | ||
| 1074 | |||
| 1075 | /* Enable autoidle to allow it to enter low power bypass */ | ||
| 1076 | omap3_dpll_allow_idle(dpll5_clk); | ||
| 1077 | |||
| 1078 | /* Program dpll5_m2_clk divider for no division */ | ||
| 1079 | dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck"); | ||
| 1080 | clk_enable(dpll5_m2_clk); | ||
| 1081 | clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST); | ||
| 1082 | |||
| 1083 | clk_disable(dpll5_m2_clk); | ||
| 1084 | clk_disable(dpll5_clk); | ||
| 1085 | return; | ||
| 1086 | } | ||
| 1087 | |||
| 1059 | /* REVISIT: Move this init stuff out into clock.c */ | 1088 | /* REVISIT: Move this init stuff out into clock.c */ |
| 1060 | 1089 | ||
| 1061 | /* | 1090 | /* |
| @@ -1148,6 +1177,12 @@ int __init omap2_clk_init(void) | |||
| 1148 | */ | 1177 | */ |
| 1149 | clk_enable_init_clocks(); | 1178 | clk_enable_init_clocks(); |
| 1150 | 1179 | ||
| 1180 | /* | ||
| 1181 | * Lock DPLL5 and put it in autoidle. | ||
| 1182 | */ | ||
| 1183 | if (omap_rev() >= OMAP3430_REV_ES2_0) | ||
| 1184 | omap3_clk_lock_dpll5(); | ||
| 1185 | |||
| 1151 | /* Avoid sleeping during omap2_clk_prepare_for_reboot() */ | 1186 | /* Avoid sleeping during omap2_clk_prepare_for_reboot() */ |
| 1152 | /* REVISIT: not yet ready for 343x */ | 1187 | /* REVISIT: not yet ready for 343x */ |
| 1153 | #if 0 | 1188 | #if 0 |
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index 1b4c1600f8d8..2fc4d6abbd0a 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
| @@ -541,7 +541,7 @@ static int __init pm_dbg_init(void) | |||
| 541 | printk(KERN_ERR "%s: only OMAP3 supported\n", __func__); | 541 | printk(KERN_ERR "%s: only OMAP3 supported\n", __func__); |
| 542 | return -ENODEV; | 542 | return -ENODEV; |
| 543 | } | 543 | } |
| 544 | 544 | ||
| 545 | d = debugfs_create_dir("pm_debug", NULL); | 545 | d = debugfs_create_dir("pm_debug", NULL); |
| 546 | if (IS_ERR(d)) | 546 | if (IS_ERR(d)) |
| 547 | return PTR_ERR(d); | 547 | return PTR_ERR(d); |
| @@ -551,7 +551,7 @@ static int __init pm_dbg_init(void) | |||
| 551 | (void) debugfs_create_file("time", S_IRUGO, | 551 | (void) debugfs_create_file("time", S_IRUGO, |
| 552 | d, (void *)DEBUG_FILE_TIMERS, &debug_fops); | 552 | d, (void *)DEBUG_FILE_TIMERS, &debug_fops); |
| 553 | 553 | ||
| 554 | pwrdm_for_each(pwrdms_setup, (void *)d); | 554 | pwrdm_for_each_nolock(pwrdms_setup, (void *)d); |
| 555 | 555 | ||
| 556 | pm_dbg_dir = debugfs_create_dir("registers", d); | 556 | pm_dbg_dir = debugfs_create_dir("registers", d); |
| 557 | if (IS_ERR(pm_dbg_dir)) | 557 | if (IS_ERR(pm_dbg_dir)) |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 0ff5a6c53aa0..378c2f618358 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -51,97 +51,112 @@ static void (*_omap_sram_idle)(u32 *addr, int save_state); | |||
| 51 | 51 | ||
| 52 | static struct powerdomain *mpu_pwrdm; | 52 | static struct powerdomain *mpu_pwrdm; |
| 53 | 53 | ||
| 54 | /* PRCM Interrupt Handler for wakeups */ | 54 | /* |
| 55 | static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | 55 | * PRCM Interrupt Handler Helper Function |
| 56 | * | ||
| 57 | * The purpose of this function is to clear any wake-up events latched | ||
| 58 | * in the PRCM PM_WKST_x registers. It is possible that a wake-up event | ||
| 59 | * may occur whilst attempting to clear a PM_WKST_x register and thus | ||
| 60 | * set another bit in this register. A while loop is used to ensure | ||
| 61 | * that any peripheral wake-up events occurring while attempting to | ||
| 62 | * clear the PM_WKST_x are detected and cleared. | ||
| 63 | */ | ||
| 64 | static int prcm_clear_mod_irqs(s16 module, u8 regs) | ||
| 56 | { | 65 | { |
| 57 | u32 wkst, irqstatus_mpu; | 66 | u32 wkst, fclk, iclk, clken; |
| 58 | u32 fclk, iclk; | 67 | u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1; |
| 59 | 68 | u16 fclk_off = (regs == 3) ? OMAP3430ES2_CM_FCLKEN3 : CM_FCLKEN1; | |
| 60 | /* WKUP */ | 69 | u16 iclk_off = (regs == 3) ? CM_ICLKEN3 : CM_ICLKEN1; |
| 61 | wkst = prm_read_mod_reg(WKUP_MOD, PM_WKST); | 70 | u16 grpsel_off = (regs == 3) ? |
| 71 | OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL; | ||
| 72 | int c = 0; | ||
| 73 | |||
| 74 | wkst = prm_read_mod_reg(module, wkst_off); | ||
| 75 | wkst &= prm_read_mod_reg(module, grpsel_off); | ||
| 62 | if (wkst) { | 76 | if (wkst) { |
| 63 | iclk = cm_read_mod_reg(WKUP_MOD, CM_ICLKEN); | 77 | iclk = cm_read_mod_reg(module, iclk_off); |
| 64 | fclk = cm_read_mod_reg(WKUP_MOD, CM_FCLKEN); | 78 | fclk = cm_read_mod_reg(module, fclk_off); |
| 65 | cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_ICLKEN); | 79 | while (wkst) { |
| 66 | cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_FCLKEN); | 80 | clken = wkst; |
| 67 | prm_write_mod_reg(wkst, WKUP_MOD, PM_WKST); | 81 | cm_set_mod_reg_bits(clken, module, iclk_off); |
| 68 | while (prm_read_mod_reg(WKUP_MOD, PM_WKST)) | 82 | /* |
| 69 | cpu_relax(); | 83 | * For USBHOST, we don't know whether HOST1 or |
| 70 | cm_write_mod_reg(iclk, WKUP_MOD, CM_ICLKEN); | 84 | * HOST2 woke us up, so enable both f-clocks |
| 71 | cm_write_mod_reg(fclk, WKUP_MOD, CM_FCLKEN); | 85 | */ |
| 86 | if (module == OMAP3430ES2_USBHOST_MOD) | ||
| 87 | clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT; | ||
| 88 | cm_set_mod_reg_bits(clken, module, fclk_off); | ||
| 89 | prm_write_mod_reg(wkst, module, wkst_off); | ||
| 90 | wkst = prm_read_mod_reg(module, wkst_off); | ||
| 91 | c++; | ||
| 92 | } | ||
| 93 | cm_write_mod_reg(iclk, module, iclk_off); | ||
| 94 | cm_write_mod_reg(fclk, module, fclk_off); | ||
| 72 | } | 95 | } |
| 73 | 96 | ||
| 74 | /* CORE */ | 97 | return c; |
| 75 | wkst = prm_read_mod_reg(CORE_MOD, PM_WKST1); | 98 | } |
| 76 | if (wkst) { | ||
| 77 | iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN1); | ||
| 78 | fclk = cm_read_mod_reg(CORE_MOD, CM_FCLKEN1); | ||
| 79 | cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN1); | ||
| 80 | cm_set_mod_reg_bits(wkst, CORE_MOD, CM_FCLKEN1); | ||
| 81 | prm_write_mod_reg(wkst, CORE_MOD, PM_WKST1); | ||
| 82 | while (prm_read_mod_reg(CORE_MOD, PM_WKST1)) | ||
| 83 | cpu_relax(); | ||
| 84 | cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN1); | ||
| 85 | cm_write_mod_reg(fclk, CORE_MOD, CM_FCLKEN1); | ||
| 86 | } | ||
| 87 | wkst = prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3); | ||
| 88 | if (wkst) { | ||
| 89 | iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN3); | ||
| 90 | fclk = cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3); | ||
| 91 | cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN3); | ||
| 92 | cm_set_mod_reg_bits(wkst, CORE_MOD, OMAP3430ES2_CM_FCLKEN3); | ||
| 93 | prm_write_mod_reg(wkst, CORE_MOD, OMAP3430ES2_PM_WKST3); | ||
| 94 | while (prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3)) | ||
| 95 | cpu_relax(); | ||
| 96 | cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN3); | ||
| 97 | cm_write_mod_reg(fclk, CORE_MOD, OMAP3430ES2_CM_FCLKEN3); | ||
| 98 | } | ||
| 99 | 99 | ||
| 100 | /* PER */ | 100 | static int _prcm_int_handle_wakeup(void) |
| 101 | wkst = prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST); | 101 | { |
| 102 | if (wkst) { | 102 | int c; |
| 103 | iclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN); | ||
| 104 | fclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN); | ||
| 105 | cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_ICLKEN); | ||
| 106 | cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_FCLKEN); | ||
| 107 | prm_write_mod_reg(wkst, OMAP3430_PER_MOD, PM_WKST); | ||
| 108 | while (prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST)) | ||
| 109 | cpu_relax(); | ||
| 110 | cm_write_mod_reg(iclk, OMAP3430_PER_MOD, CM_ICLKEN); | ||
| 111 | cm_write_mod_reg(fclk, OMAP3430_PER_MOD, CM_FCLKEN); | ||
| 112 | } | ||
| 113 | 103 | ||
| 104 | c = prcm_clear_mod_irqs(WKUP_MOD, 1); | ||
| 105 | c += prcm_clear_mod_irqs(CORE_MOD, 1); | ||
| 106 | c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1); | ||
| 114 | if (omap_rev() > OMAP3430_REV_ES1_0) { | 107 | if (omap_rev() > OMAP3430_REV_ES1_0) { |
| 115 | /* USBHOST */ | 108 | c += prcm_clear_mod_irqs(CORE_MOD, 3); |
| 116 | wkst = prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, PM_WKST); | 109 | c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1); |
| 117 | if (wkst) { | ||
| 118 | iclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, | ||
| 119 | CM_ICLKEN); | ||
| 120 | fclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, | ||
| 121 | CM_FCLKEN); | ||
| 122 | cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD, | ||
| 123 | CM_ICLKEN); | ||
| 124 | cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD, | ||
| 125 | CM_FCLKEN); | ||
| 126 | prm_write_mod_reg(wkst, OMAP3430ES2_USBHOST_MOD, | ||
| 127 | PM_WKST); | ||
| 128 | while (prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, | ||
| 129 | PM_WKST)) | ||
| 130 | cpu_relax(); | ||
| 131 | cm_write_mod_reg(iclk, OMAP3430ES2_USBHOST_MOD, | ||
| 132 | CM_ICLKEN); | ||
| 133 | cm_write_mod_reg(fclk, OMAP3430ES2_USBHOST_MOD, | ||
| 134 | CM_FCLKEN); | ||
| 135 | } | ||
| 136 | } | 110 | } |
| 137 | 111 | ||
| 138 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, | 112 | return c; |
| 139 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 113 | } |
| 140 | prm_write_mod_reg(irqstatus_mpu, OCP_MOD, | 114 | |
| 141 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 115 | /* |
| 116 | * PRCM Interrupt Handler | ||
| 117 | * | ||
| 118 | * The PRM_IRQSTATUS_MPU register indicates if there are any pending | ||
| 119 | * interrupts from the PRCM for the MPU. These bits must be cleared in | ||
| 120 | * order to clear the PRCM interrupt. The PRCM interrupt handler is | ||
| 121 | * implemented to simply clear the PRM_IRQSTATUS_MPU in order to clear | ||
| 122 | * the PRCM interrupt. Please note that bit 0 of the PRM_IRQSTATUS_MPU | ||
| 123 | * register indicates that a wake-up event is pending for the MPU and | ||
| 124 | * this bit can only be cleared if the all the wake-up events latched | ||
| 125 | * in the various PM_WKST_x registers have been cleared. The interrupt | ||
| 126 | * handler is implemented using a do-while loop so that if a wake-up | ||
| 127 | * event occurred during the processing of the prcm interrupt handler | ||
| 128 | * (setting a bit in the corresponding PM_WKST_x register and thus | ||
| 129 | * preventing us from clearing bit 0 of the PRM_IRQSTATUS_MPU register) | ||
| 130 | * this would be handled. | ||
| 131 | */ | ||
| 132 | static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) | ||
| 133 | { | ||
| 134 | u32 irqstatus_mpu; | ||
| 135 | int c = 0; | ||
| 136 | |||
| 137 | do { | ||
| 138 | irqstatus_mpu = prm_read_mod_reg(OCP_MOD, | ||
| 139 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
| 140 | |||
| 141 | if (irqstatus_mpu & (OMAP3430_WKUP_ST | OMAP3430_IO_ST)) { | ||
| 142 | c = _prcm_int_handle_wakeup(); | ||
| 143 | |||
| 144 | /* | ||
| 145 | * Is the MPU PRCM interrupt handler racing with the | ||
| 146 | * IVA2 PRCM interrupt handler ? | ||
| 147 | */ | ||
| 148 | WARN(c == 0, "prcm: WARNING: PRCM indicated MPU wakeup " | ||
| 149 | "but no wakeup sources are marked\n"); | ||
| 150 | } else { | ||
| 151 | /* XXX we need to expand our PRCM interrupt handler */ | ||
| 152 | WARN(1, "prcm: WARNING: PRCM interrupt received, but " | ||
| 153 | "no code to handle it (%08x)\n", irqstatus_mpu); | ||
| 154 | } | ||
| 155 | |||
| 156 | prm_write_mod_reg(irqstatus_mpu, OCP_MOD, | ||
| 157 | OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
| 142 | 158 | ||
| 143 | while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET)) | 159 | } while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET)); |
| 144 | cpu_relax(); | ||
| 145 | 160 | ||
| 146 | return IRQ_HANDLED; | 161 | return IRQ_HANDLED; |
| 147 | } | 162 | } |
| @@ -624,6 +639,16 @@ static void __init prcm_setup_regs(void) | |||
| 624 | prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, | 639 | prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, |
| 625 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); | 640 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
| 626 | 641 | ||
| 642 | /* Enable GPIO wakeups in PER */ | ||
| 643 | prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 | | ||
| 644 | OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 | | ||
| 645 | OMAP3430_EN_GPIO6, OMAP3430_PER_MOD, PM_WKEN); | ||
| 646 | /* and allow them to wake up MPU */ | ||
| 647 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 | | ||
| 648 | OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 | | ||
| 649 | OMAP3430_GRPSEL_GPIO6, | ||
| 650 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); | ||
| 651 | |||
| 627 | /* Don't attach IVA interrupts */ | 652 | /* Don't attach IVA interrupts */ |
| 628 | prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); | 653 | prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); |
| 629 | prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); | 654 | prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 2594cbff3947..f00289abd30f 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
| @@ -273,35 +273,50 @@ struct powerdomain *pwrdm_lookup(const char *name) | |||
| 273 | } | 273 | } |
| 274 | 274 | ||
| 275 | /** | 275 | /** |
| 276 | * pwrdm_for_each - call function on each registered clockdomain | 276 | * pwrdm_for_each_nolock - call function on each registered clockdomain |
| 277 | * @fn: callback function * | 277 | * @fn: callback function * |
| 278 | * | 278 | * |
| 279 | * Call the supplied function for each registered powerdomain. The | 279 | * Call the supplied function for each registered powerdomain. The |
| 280 | * callback function can return anything but 0 to bail out early from | 280 | * callback function can return anything but 0 to bail out early from |
| 281 | * the iterator. The callback function is called with the pwrdm_rwlock | 281 | * the iterator. Returns the last return value of the callback function, which |
| 282 | * held for reading, so no powerdomain structure manipulation | 282 | * should be 0 for success or anything else to indicate failure; or -EINVAL if |
| 283 | * functions should be called from the callback, although hardware | 283 | * the function pointer is null. |
| 284 | * powerdomain control functions are fine. Returns the last return | ||
| 285 | * value of the callback function, which should be 0 for success or | ||
| 286 | * anything else to indicate failure; or -EINVAL if the function | ||
| 287 | * pointer is null. | ||
| 288 | */ | 284 | */ |
| 289 | int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), | 285 | int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user), |
| 290 | void *user) | 286 | void *user) |
| 291 | { | 287 | { |
| 292 | struct powerdomain *temp_pwrdm; | 288 | struct powerdomain *temp_pwrdm; |
| 293 | unsigned long flags; | ||
| 294 | int ret = 0; | 289 | int ret = 0; |
| 295 | 290 | ||
| 296 | if (!fn) | 291 | if (!fn) |
| 297 | return -EINVAL; | 292 | return -EINVAL; |
| 298 | 293 | ||
| 299 | read_lock_irqsave(&pwrdm_rwlock, flags); | ||
| 300 | list_for_each_entry(temp_pwrdm, &pwrdm_list, node) { | 294 | list_for_each_entry(temp_pwrdm, &pwrdm_list, node) { |
| 301 | ret = (*fn)(temp_pwrdm, user); | 295 | ret = (*fn)(temp_pwrdm, user); |
| 302 | if (ret) | 296 | if (ret) |
| 303 | break; | 297 | break; |
| 304 | } | 298 | } |
| 299 | |||
| 300 | return ret; | ||
| 301 | } | ||
| 302 | |||
| 303 | /** | ||
| 304 | * pwrdm_for_each - call function on each registered clockdomain | ||
| 305 | * @fn: callback function * | ||
| 306 | * | ||
| 307 | * This function is the same as 'pwrdm_for_each_nolock()', but keeps the | ||
| 308 | * &pwrdm_rwlock locked for reading, so no powerdomain structure manipulation | ||
| 309 | * functions should be called from the callback, although hardware powerdomain | ||
| 310 | * control functions are fine. | ||
| 311 | */ | ||
| 312 | int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), | ||
| 313 | void *user) | ||
| 314 | { | ||
| 315 | unsigned long flags; | ||
| 316 | int ret; | ||
| 317 | |||
| 318 | read_lock_irqsave(&pwrdm_rwlock, flags); | ||
| 319 | ret = pwrdm_for_each_nolock(fn, user); | ||
| 305 | read_unlock_irqrestore(&pwrdm_rwlock, flags); | 320 | read_unlock_irqrestore(&pwrdm_rwlock, flags); |
| 306 | 321 | ||
| 307 | return ret; | 322 | return ret; |
diff --git a/arch/arm/plat-omap/include/mach/cpu.h b/arch/arm/plat-omap/include/mach/cpu.h index 11e73d9e8928..f129efb3075e 100644 --- a/arch/arm/plat-omap/include/mach/cpu.h +++ b/arch/arm/plat-omap/include/mach/cpu.h | |||
| @@ -303,32 +303,21 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
| 303 | #define cpu_is_omap2430() 0 | 303 | #define cpu_is_omap2430() 0 |
| 304 | #define cpu_is_omap3430() 0 | 304 | #define cpu_is_omap3430() 0 |
| 305 | 305 | ||
| 306 | #if defined(MULTI_OMAP1) | ||
| 307 | # if defined(CONFIG_ARCH_OMAP730) | ||
| 308 | # undef cpu_is_omap730 | ||
| 309 | # define cpu_is_omap730() is_omap730() | ||
| 310 | # endif | ||
| 311 | # if defined(CONFIG_ARCH_OMAP850) | ||
| 312 | # undef cpu_is_omap850 | ||
| 313 | # define cpu_is_omap850() is_omap850() | ||
| 314 | # endif | ||
| 315 | #else | ||
| 316 | # if defined(CONFIG_ARCH_OMAP730) | ||
| 317 | # undef cpu_is_omap730 | ||
| 318 | # define cpu_is_omap730() 1 | ||
| 319 | # endif | ||
| 320 | #endif | ||
| 321 | #else | ||
| 322 | # if defined(CONFIG_ARCH_OMAP850) | ||
| 323 | # undef cpu_is_omap850 | ||
| 324 | # define cpu_is_omap850() 1 | ||
| 325 | # endif | ||
| 326 | #endif | ||
| 327 | |||
| 328 | /* | 306 | /* |
| 329 | * Whether we have MULTI_OMAP1 or not, we still need to distinguish | 307 | * Whether we have MULTI_OMAP1 or not, we still need to distinguish |
| 330 | * between 330 vs. 1510 and 1611B/5912 vs. 1710. | 308 | * between 730 vs 850, 330 vs. 1510 and 1611B/5912 vs. 1710. |
| 331 | */ | 309 | */ |
| 310 | |||
| 311 | #if defined(CONFIG_ARCH_OMAP730) | ||
| 312 | # undef cpu_is_omap730 | ||
| 313 | # define cpu_is_omap730() is_omap730() | ||
| 314 | #endif | ||
| 315 | |||
| 316 | #if defined(CONFIG_ARCH_OMAP850) | ||
| 317 | # undef cpu_is_omap850 | ||
| 318 | # define cpu_is_omap850() is_omap850() | ||
| 319 | #endif | ||
| 320 | |||
| 332 | #if defined(CONFIG_ARCH_OMAP15XX) | 321 | #if defined(CONFIG_ARCH_OMAP15XX) |
| 333 | # undef cpu_is_omap310 | 322 | # undef cpu_is_omap310 |
| 334 | # undef cpu_is_omap1510 | 323 | # undef cpu_is_omap1510 |
| @@ -433,3 +422,5 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
| 433 | 422 | ||
| 434 | int omap_chip_is(struct omap_chip_id oci); | 423 | int omap_chip_is(struct omap_chip_id oci); |
| 435 | void omap2_check_revision(void); | 424 | void omap2_check_revision(void); |
| 425 | |||
| 426 | #endif | ||
diff --git a/arch/arm/plat-omap/include/mach/powerdomain.h b/arch/arm/plat-omap/include/mach/powerdomain.h index 6271d8556a40..fa6461423bd0 100644 --- a/arch/arm/plat-omap/include/mach/powerdomain.h +++ b/arch/arm/plat-omap/include/mach/powerdomain.h | |||
| @@ -135,6 +135,8 @@ struct powerdomain *pwrdm_lookup(const char *name); | |||
| 135 | 135 | ||
| 136 | int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), | 136 | int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), |
| 137 | void *user); | 137 | void *user); |
| 138 | int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user), | ||
| 139 | void *user); | ||
| 138 | 140 | ||
| 139 | int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); | 141 | int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); |
| 140 | int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); | 142 | int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); |
diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index 57f7122a0919..dc3fac3dd0ea 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | * 'va': mpu virtual address | 47 | * 'va': mpu virtual address |
| 48 | * | 48 | * |
| 49 | * 'c': contiguous memory area | 49 | * 'c': contiguous memory area |
| 50 | * 'd': dicontiguous memory area | 50 | * 'd': discontiguous memory area |
| 51 | * 'a': anonymous memory allocation | 51 | * 'a': anonymous memory allocation |
| 52 | * '()': optional feature | 52 | * '()': optional feature |
| 53 | * | 53 | * |
| @@ -363,8 +363,9 @@ void *da_to_va(struct iommu *obj, u32 da) | |||
| 363 | goto out; | 363 | goto out; |
| 364 | } | 364 | } |
| 365 | va = area->va; | 365 | va = area->va; |
| 366 | mutex_unlock(&obj->mmap_lock); | ||
| 367 | out: | 366 | out: |
| 367 | mutex_unlock(&obj->mmap_lock); | ||
| 368 | |||
| 368 | return va; | 369 | return va; |
| 369 | } | 370 | } |
| 370 | EXPORT_SYMBOL_GPL(da_to_va); | 371 | EXPORT_SYMBOL_GPL(da_to_va); |
| @@ -398,7 +399,7 @@ static inline void sgtable_drain_vmalloc(struct sg_table *sgt) | |||
| 398 | { | 399 | { |
| 399 | /* | 400 | /* |
| 400 | * Actually this is not necessary at all, just exists for | 401 | * Actually this is not necessary at all, just exists for |
| 401 | * consistency of the code readibility. | 402 | * consistency of the code readability. |
| 402 | */ | 403 | */ |
| 403 | BUG_ON(!sgt); | 404 | BUG_ON(!sgt); |
| 404 | } | 405 | } |
| @@ -434,7 +435,7 @@ static inline void sgtable_drain_kmalloc(struct sg_table *sgt) | |||
| 434 | { | 435 | { |
| 435 | /* | 436 | /* |
| 436 | * Actually this is not necessary at all, just exists for | 437 | * Actually this is not necessary at all, just exists for |
| 437 | * consistency of the code readibility | 438 | * consistency of the code readability |
| 438 | */ | 439 | */ |
| 439 | BUG_ON(!sgt); | 440 | BUG_ON(!sgt); |
| 440 | } | 441 | } |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 925f64711c37..75d1f26e5b17 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -270,7 +270,8 @@ void * omap_sram_push(void * start, unsigned long size) | |||
| 270 | omap_sram_ceil -= size; | 270 | omap_sram_ceil -= size; |
| 271 | omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); | 271 | omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); |
| 272 | memcpy((void *)omap_sram_ceil, start, size); | 272 | memcpy((void *)omap_sram_ceil, start, size); |
| 273 | flush_icache_range((unsigned long)start, (unsigned long)(start + size)); | 273 | flush_icache_range((unsigned long)omap_sram_ceil, |
| 274 | (unsigned long)(omap_sram_ceil + size)); | ||
| 274 | 275 | ||
| 275 | return (void *)omap_sram_ceil; | 276 | return (void *)omap_sram_ceil; |
| 276 | } | 277 | } |
diff --git a/arch/blackfin/ADI_BSD.txt b/arch/blackfin/ADI_BSD.txt new file mode 100644 index 000000000000..501d0b645943 --- /dev/null +++ b/arch/blackfin/ADI_BSD.txt | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | This BSD-Style License applies to a few files in ./arch/blackfin directory, | ||
| 2 | and is included here, so people understand which code they can use outside | ||
| 3 | the Linux kernel, in non-GPL based projects. | ||
| 4 | |||
| 5 | Using the files released under the "ADI BSD" license, must comply with | ||
| 6 | these license terms. | ||
| 7 | |||
| 8 | -------------------------------------------------------------------------- | ||
| 9 | |||
| 10 | Copyright Analog Devices, Inc. | ||
| 11 | |||
| 12 | All rights reserved. | ||
| 13 | |||
| 14 | Redistribution and use in source and binary forms, with or without | ||
| 15 | modification, are permitted provided that the following conditions | ||
| 16 | are met: | ||
| 17 | - Redistributions of source code must retain the above copyright | ||
| 18 | notice, this list of conditions and the following disclaimer. | ||
| 19 | - Redistributions in binary form must reproduce the above copyright | ||
| 20 | notice, this list of conditions and the following disclaimer in | ||
| 21 | the documentation and/or other materials provided with the | ||
| 22 | distribution. | ||
| 23 | - Neither the name of Analog Devices, Inc. nor the names of its | ||
| 24 | contributors may be used to endorse or promote products derived | ||
| 25 | from this software without specific prior written permission. | ||
| 26 | - The use of this software may or may not infringe the patent rights | ||
| 27 | of one or more patent holders. This license does not release you | ||
| 28 | from the requirement that you obtain separate licenses from these | ||
| 29 | patent holders to use this software. | ||
| 30 | |||
| 31 | THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR | ||
| 32 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, | ||
| 33 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||
| 34 | IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 35 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 36 | BUT NOT LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF | ||
| 37 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
| 38 | BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
| 39 | WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | ||
| 40 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | ||
| 41 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE | ||
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 9a01d445eca8..ae6a60f10120 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
| @@ -47,6 +47,9 @@ config GENERIC_HARDIRQS | |||
| 47 | config GENERIC_IRQ_PROBE | 47 | config GENERIC_IRQ_PROBE |
| 48 | def_bool y | 48 | def_bool y |
| 49 | 49 | ||
| 50 | config GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 51 | def_bool y | ||
| 52 | |||
| 50 | config GENERIC_GPIO | 53 | config GENERIC_GPIO |
| 51 | def_bool y | 54 | def_bool y |
| 52 | 55 | ||
| @@ -229,7 +232,7 @@ endchoice | |||
| 229 | 232 | ||
| 230 | config SMP | 233 | config SMP |
| 231 | depends on BF561 | 234 | depends on BF561 |
| 232 | select GENERIC_TIME | 235 | select GENERIC_CLOCKEVENTS |
| 233 | bool "Symmetric multi-processing support" | 236 | bool "Symmetric multi-processing support" |
| 234 | ---help--- | 237 | ---help--- |
| 235 | This enables support for systems with more than one CPU, | 238 | This enables support for systems with more than one CPU, |
| @@ -613,12 +616,10 @@ comment "Kernel Timer/Scheduler" | |||
| 613 | source kernel/Kconfig.hz | 616 | source kernel/Kconfig.hz |
| 614 | 617 | ||
| 615 | config GENERIC_TIME | 618 | config GENERIC_TIME |
| 616 | bool "Generic time" | 619 | def_bool y |
| 617 | default y | ||
| 618 | 620 | ||
| 619 | config GENERIC_CLOCKEVENTS | 621 | config GENERIC_CLOCKEVENTS |
| 620 | bool "Generic clock events" | 622 | bool "Generic clock events" |
| 621 | depends on GENERIC_TIME | ||
| 622 | default y | 623 | default y |
| 623 | 624 | ||
| 624 | choice | 625 | choice |
| @@ -653,6 +654,10 @@ config GPTMR0_CLOCKSOURCE | |||
| 653 | depends on GENERIC_CLOCKEVENTS | 654 | depends on GENERIC_CLOCKEVENTS |
| 654 | depends on !TICKSOURCE_GPTMR0 | 655 | depends on !TICKSOURCE_GPTMR0 |
| 655 | 656 | ||
| 657 | config ARCH_USES_GETTIMEOFFSET | ||
| 658 | depends on !GENERIC_CLOCKEVENTS | ||
| 659 | def_bool y | ||
| 660 | |||
| 656 | source kernel/time/Kconfig | 661 | source kernel/time/Kconfig |
| 657 | 662 | ||
| 658 | comment "Misc" | 663 | comment "Misc" |
diff --git a/arch/blackfin/include/asm/atomic.h b/arch/blackfin/include/asm/atomic.h index 88f36d599fe8..d27c6274247d 100644 --- a/arch/blackfin/include/asm/atomic.h +++ b/arch/blackfin/include/asm/atomic.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | Â * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | Â * | ||
| 4 | Â * Licensed under the GPL-2 or later. | ||
| 5 | Â */ | ||
| 6 | |||
| 1 | #ifndef __ARCH_BLACKFIN_ATOMIC__ | 7 | #ifndef __ARCH_BLACKFIN_ATOMIC__ |
| 2 | #define __ARCH_BLACKFIN_ATOMIC__ | 8 | #define __ARCH_BLACKFIN_ATOMIC__ |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/bfin-global.h b/arch/blackfin/include/asm/bfin-global.h index aef0594e7865..10064f902d20 100644 --- a/arch/blackfin/include/asm/bfin-global.h +++ b/arch/blackfin/include/asm/bfin-global.h | |||
| @@ -1,29 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/bfin-global.h | 2 | * Global extern defines for blackfin |
| 3 | * Based on: | ||
| 4 | * Author: * | ||
| 5 | * Created: | ||
| 6 | * Description: Global extern defines for blackfin | ||
| 7 | * | 3 | * |
| 8 | * Modified: | 4 | * Copyright 2006-2009 Analog Devices Inc. |
| 9 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 10 | * | 5 | * |
| 11 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 6 | * Licensed under the GPL-2 or later. |
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2 of the License, or | ||
| 16 | * (at your option) any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; if not, see the file COPYING, or write | ||
| 25 | * to the Free Software Foundation, Inc., | ||
| 26 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 27 | */ | 7 | */ |
| 28 | 8 | ||
| 29 | #ifndef _BFIN_GLOBAL_H_ | 9 | #ifndef _BFIN_GLOBAL_H_ |
diff --git a/arch/blackfin/include/asm/bfin5xx_spi.h b/arch/blackfin/include/asm/bfin5xx_spi.h index c281c6328276..ed4f8c6db0cd 100644 --- a/arch/blackfin/include/asm/bfin5xx_spi.h +++ b/arch/blackfin/include/asm/bfin5xx_spi.h | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2008 Analog Devices Inc. | 4 | * Copyright 2004-2008 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 9 | */ | 7 | */ |
| 10 | 8 | ||
diff --git a/arch/blackfin/include/asm/bfin_rotary.h b/arch/blackfin/include/asm/bfin_rotary.h index 425ece64fd5e..abdb2af52902 100644 --- a/arch/blackfin/include/asm/bfin_rotary.h +++ b/arch/blackfin/include/asm/bfin_rotary.h | |||
| @@ -1,6 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * board initialization should put one of these structures into platform_data | 2 | * board initialization should put one of these structures into platform_data |
| 3 | * and place the bfin-rotary onto platform_bus named "bfin-rotary". | 3 | * and place the bfin-rotary onto platform_bus named "bfin-rotary". |
| 4 | * | ||
| 5 | * Copyright 2008 Analog Devices Inc. | ||
| 6 | * | ||
| 7 | * Licensed under the GPL-2 or later. | ||
| 4 | */ | 8 | */ |
| 5 | 9 | ||
| 6 | #ifndef _BFIN_ROTARY_H | 10 | #ifndef _BFIN_ROTARY_H |
diff --git a/arch/blackfin/include/asm/bfin_simple_timer.h b/arch/blackfin/include/asm/bfin_simple_timer.h index fccbb595464a..5248c133bc68 100644 --- a/arch/blackfin/include/asm/bfin_simple_timer.h +++ b/arch/blackfin/include/asm/bfin_simple_timer.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2006-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _bfin_simple_timer_h_ | 7 | #ifndef _bfin_simple_timer_h_ |
| 2 | #define _bfin_simple_timer_h_ | 8 | #define _bfin_simple_timer_h_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h index daffa71576d4..a2ff3fb3568d 100644 --- a/arch/blackfin/include/asm/bitops.h +++ b/arch/blackfin/include/asm/bitops.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_BITOPS_H | 7 | #ifndef _BLACKFIN_BITOPS_H |
| 2 | #define _BLACKFIN_BITOPS_H | 8 | #define _BLACKFIN_BITOPS_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/blackfin.h b/arch/blackfin/include/asm/blackfin.h index 4d4439583396..eb7c1441d8f9 100644 --- a/arch/blackfin/include/asm/blackfin.h +++ b/arch/blackfin/include/asm/blackfin.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Common header file for blackfin family of processors. | 2 | * Common header file for Blackfin family of processors. |
| 3 | * | 3 | * |
| 4 | Â * Copyright 2004-2009 Analog Devices Inc. | ||
| 5 | Â * | ||
| 6 | Â * Licensed under the GPL-2 or later. | ||
| 4 | */ | 7 | */ |
| 5 | 8 | ||
| 6 | #ifndef _BLACKFIN_H_ | 9 | #ifndef _BLACKFIN_H_ |
diff --git a/arch/blackfin/include/asm/bug.h b/arch/blackfin/include/asm/bug.h index 655e49540e41..6f4548a13555 100644 --- a/arch/blackfin/include/asm/bug.h +++ b/arch/blackfin/include/asm/bug.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_BUG_H | 7 | #ifndef _BLACKFIN_BUG_H |
| 2 | #define _BLACKFIN_BUG_H | 8 | #define _BLACKFIN_BUG_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/byteorder.h b/arch/blackfin/include/asm/byteorder.h index 3e69106a4d37..9558416d578b 100644 --- a/arch/blackfin/include/asm/byteorder.h +++ b/arch/blackfin/include/asm/byteorder.h | |||
| @@ -1,6 +1 @@ | |||
| 1 | #ifndef _BLACKFIN_BYTEORDER_H | ||
| 2 | #define _BLACKFIN_BYTEORDER_H | ||
| 3 | |||
| 4 | #include <linux/byteorder/little_endian.h> | #include <linux/byteorder/little_endian.h> | |
| 5 | |||
| 6 | #endif /* _BLACKFIN_BYTEORDER_H */ | ||
diff --git a/arch/blackfin/include/asm/cache.h b/arch/blackfin/include/asm/cache.h index 477050ad5c53..8542bc31f63c 100644 --- a/arch/blackfin/include/asm/cache.h +++ b/arch/blackfin/include/asm/cache.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-blackfin/cache.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 3 | */ | 5 | */ |
| 6 | |||
| 4 | #ifndef __ARCH_BLACKFIN_CACHE_H | 7 | #ifndef __ARCH_BLACKFIN_CACHE_H |
| 5 | #define __ARCH_BLACKFIN_CACHE_H | 8 | #define __ARCH_BLACKFIN_CACHE_H |
| 6 | 9 | ||
| @@ -35,10 +38,10 @@ | |||
| 35 | 38 | ||
| 36 | #if defined(CONFIG_SMP) && \ | 39 | #if defined(CONFIG_SMP) && \ |
| 37 | !defined(CONFIG_BFIN_CACHE_COHERENT) | 40 | !defined(CONFIG_BFIN_CACHE_COHERENT) |
| 38 | # if defined(CONFIG_BFIN_ICACHEABLE) || defined(CONFIG_BFIN_L2_ICACHEABLE) | 41 | # if defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) || defined(CONFIG_BFIN_L2_ICACHEABLE) |
| 39 | # define __ARCH_SYNC_CORE_ICACHE | 42 | # define __ARCH_SYNC_CORE_ICACHE |
| 40 | # endif | 43 | # endif |
| 41 | # if defined(CONFIG_BFIN_DCACHEABLE) || defined(CONFIG_BFIN_L2_DCACHEABLE) | 44 | # if defined(CONFIG_BFIN_EXTMEM_DCACHEABLE) || defined(CONFIG_BFIN_L2_DCACHEABLE) |
| 42 | # define __ARCH_SYNC_CORE_DCACHE | 45 | # define __ARCH_SYNC_CORE_DCACHE |
| 43 | # endif | 46 | # endif |
| 44 | #ifndef __ASSEMBLY__ | 47 | #ifndef __ASSEMBLY__ |
diff --git a/arch/blackfin/include/asm/cacheflush.h b/arch/blackfin/include/asm/cacheflush.h index 7e55549e180f..af03a36c7a4e 100644 --- a/arch/blackfin/include/asm/cacheflush.h +++ b/arch/blackfin/include/asm/cacheflush.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/cacheflush.h | 2 | * Blackfin low-level cache routines |
| 3 | * Based on: include/asm-m68knommu/cacheflush.h | ||
| 4 | * Author: LG Soft India | ||
| 5 | * Copyright (C) 2004 Analog Devices Inc. | ||
| 6 | * Created: Tue Sep 21 2004 | ||
| 7 | * Description: Blackfin low-level cache routines adapted from the i386 | ||
| 8 | * and PPC versions by Greg Ungerer (gerg@snapgear.com) | ||
| 9 | * | 3 | * |
| 10 | * Modified: | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 11 | * | 5 | * |
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 6 | * Licensed under the GPL-2 or later. |
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 17 | * any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; see the file COPYING. | ||
| 26 | * If not, write to the Free Software Foundation, | ||
| 27 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef _BLACKFIN_CACHEFLUSH_H | 9 | #ifndef _BLACKFIN_CACHEFLUSH_H |
diff --git a/arch/blackfin/include/asm/cdef_LPBlackfin.h b/arch/blackfin/include/asm/cdef_LPBlackfin.h index 35f841bce57d..8778e0f03730 100644 --- a/arch/blackfin/include/asm/cdef_LPBlackfin.h +++ b/arch/blackfin/include/asm/cdef_LPBlackfin.h | |||
| @@ -1,30 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-common/cdef_LPBlackfin.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * Based on: | 3 | * |
| 4 | * Author: unknown | 4 | * Licensed under the GPL-2 or later. |
| 5 | * COPYRIGHT 2005 Analog Devices | 5 | */ |
| 6 | * Created: ? | ||
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * | ||
| 11 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 16 | * any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; see the file COPYING. | ||
| 25 | * If not, write to the Free Software Foundation, | ||
| 26 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 27 | */ | ||
| 28 | 6 | ||
| 29 | #ifndef _CDEF_LPBLACKFIN_H | 7 | #ifndef _CDEF_LPBLACKFIN_H |
| 30 | #define _CDEF_LPBLACKFIN_H | 8 | #define _CDEF_LPBLACKFIN_H |
diff --git a/arch/blackfin/include/asm/checksum.h b/arch/blackfin/include/asm/checksum.h index 793581fc9556..a23415be0de1 100644 --- a/arch/blackfin/include/asm/checksum.h +++ b/arch/blackfin/include/asm/checksum.h | |||
| @@ -1,9 +1,14 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * akbar.hussain@lineo.com | ||
| 4 | * | ||
| 5 | * Licensed under the GPL-2 or later. | ||
| 6 | */ | ||
| 7 | |||
| 1 | #ifndef _BFIN_CHECKSUM_H | 8 | #ifndef _BFIN_CHECKSUM_H |
| 2 | #define _BFIN_CHECKSUM_H | 9 | #define _BFIN_CHECKSUM_H |
| 3 | 10 | ||
| 4 | /* | 11 | /* |
| 5 | * MODIFIED FOR BFIN April 30, 2001 akbar.hussain@lineo.com | ||
| 6 | * | ||
| 7 | * computes the checksum of a memory block at buff, length len, | 12 | * computes the checksum of a memory block at buff, length len, |
| 8 | * and adds in "sum" (32-bit) | 13 | * and adds in "sum" (32-bit) |
| 9 | * | 14 | * |
diff --git a/arch/blackfin/include/asm/clocks.h b/arch/blackfin/include/asm/clocks.h index 033bba92d61c..f80dad5ff257 100644 --- a/arch/blackfin/include/asm/clocks.h +++ b/arch/blackfin/include/asm/clocks.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-common/clocks.h | 2 | * Common Clock definitions for various kernel files |
| 3 | * Based on: include/asm-blackfin/mach-bf537/bf537.h | ||
| 4 | * Author: Robin Getz <rgetz@blackfin.uclinux.org> | ||
| 5 | * | 3 | * |
| 6 | * Created: 25Jul07 | 4 | * Copyright 2007-2008 Analog Devices Inc. |
| 7 | * Description: Common Clock definitions for various kernel files | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef _BFIN_CLOCKS_H | 9 | #ifndef _BFIN_CLOCKS_H |
diff --git a/arch/blackfin/include/asm/context.S b/arch/blackfin/include/asm/context.S index f8a664f022b1..5dffaf582a22 100644 --- a/arch/blackfin/include/asm/context.S +++ b/arch/blackfin/include/asm/context.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/context.S | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | /* | 7 | /* |
diff --git a/arch/blackfin/include/asm/cplb.h b/arch/blackfin/include/asm/cplb.h index d18d16837a6d..fda96261ed62 100644 --- a/arch/blackfin/include/asm/cplb.h +++ b/arch/blackfin/include/asm/cplb.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/cplb.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: include/asm-blackfin/mach-bf537/bf537.h | ||
| 4 | * Author: Robin Getz <rgetz@blackfin.uclinux.org> | ||
| 5 | * | 3 | * |
| 6 | * Created: 2000 | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Common CPLB definitions for CPLB init | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #ifndef _CPLB_H | 7 | #ifndef _CPLB_H |
diff --git a/arch/blackfin/include/asm/cplbinit.h b/arch/blackfin/include/asm/cplbinit.h index 05b14a631d0c..f315c83a015d 100644 --- a/arch/blackfin/include/asm/cplbinit.h +++ b/arch/blackfin/include/asm/cplbinit.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/cplbinit.h | 2 | * Common CPLB definitions for CPLB init |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2006-2008 Analog Devices Inc. |
| 7 | * Description: | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef __ASM_CPLBINIT_H__ | 9 | #ifndef __ASM_CPLBINIT_H__ |
diff --git a/arch/blackfin/include/asm/cpu.h b/arch/blackfin/include/asm/cpu.h index fadfa82f93b2..b191dc662bd8 100644 --- a/arch/blackfin/include/asm/cpu.h +++ b/arch/blackfin/include/asm/cpu.h | |||
| @@ -1,23 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/include/asm/cpu.h. | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Author: Philippe Gerum <rpm@xenomai.org> | 3 | * Philippe Gerum <rpm@xenomai.org> |
| 4 | * | 4 | * |
| 5 | * Copyright 2007 Analog Devices Inc. | 5 | * Licensed under the GPL-2 or later. |
| 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; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, see the file COPYING, or write | ||
| 19 | * to the Free Software Foundation, Inc., | ||
| 20 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 21 | */ | 6 | */ |
| 22 | 7 | ||
| 23 | #ifndef __ASM_BLACKFIN_CPU_H | 8 | #ifndef __ASM_BLACKFIN_CPU_H |
diff --git a/arch/blackfin/include/asm/def_LPBlackfin.h b/arch/blackfin/include/asm/def_LPBlackfin.h index 6341eebff3dc..25906468622f 100644 --- a/arch/blackfin/include/asm/def_LPBlackfin.h +++ b/arch/blackfin/include/asm/def_LPBlackfin.h | |||
| @@ -1,32 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-common/def_LPBlackfin.h | 2 | * Blackfin core register bit & address definitions |
| 3 | * Based on: | 3 | * |
| 4 | * Author: unknown | 4 | * Copyright 2005-2008 Analog Devices Inc. |
| 5 | * COPYRIGHT 2005 Analog Devices | 5 | * |
| 6 | * Created: ? | 6 | * Licensed under the ADI BSD license or GPL-2 (or later). |
| 7 | * Description: | 7 | */ |
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * | ||
| 11 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 16 | * any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | * | ||
| 23 | * You should have received a copy of the GNU General Public License | ||
| 24 | * along with this program; see the file COPYING. | ||
| 25 | * If not, write to the Free Software Foundation, | ||
| 26 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 27 | */ | ||
| 28 | |||
| 29 | /* LP Blackfin CORE REGISTER BIT & ADDRESS DEFINITIONS FOR ADSP-BF532/33 */ | ||
| 30 | 8 | ||
| 31 | #ifndef _DEF_LPBLACKFIN_H | 9 | #ifndef _DEF_LPBLACKFIN_H |
| 32 | #define _DEF_LPBLACKFIN_H | 10 | #define _DEF_LPBLACKFIN_H |
diff --git a/arch/blackfin/include/asm/dma-mapping.h b/arch/blackfin/include/asm/dma-mapping.h index ed6b1f3cccce..7a23d824ac96 100644 --- a/arch/blackfin/include/asm/dma-mapping.h +++ b/arch/blackfin/include/asm/dma-mapping.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_DMA_MAPPING_H | 7 | #ifndef _BLACKFIN_DMA_MAPPING_H |
| 2 | #define _BLACKFIN_DMA_MAPPING_H | 8 | #define _BLACKFIN_DMA_MAPPING_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/dpmc.h b/arch/blackfin/include/asm/dpmc.h index 96e8208f929a..925e66cb2d49 100644 --- a/arch/blackfin/include/asm/dpmc.h +++ b/arch/blackfin/include/asm/dpmc.h | |||
| @@ -1,9 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-blackfin/dpmc.h - Miscellaneous IOCTL commands for Dynamic Power | 2 | * Miscellaneous IOCTL commands for Dynamic Power Management Controller Driver |
| 3 | * Management Controller Driver. | 3 | * |
| 4 | * Copyright (C) 2004-2008 Analog Device Inc. | 4 | * Copyright (C) 2004-2008 Analog Device Inc. |
| 5 | * | 5 | * |
| 6 | * Licensed under the GPL-2 | ||
| 6 | */ | 7 | */ |
| 8 | |||
| 7 | #ifndef _BLACKFIN_DPMC_H_ | 9 | #ifndef _BLACKFIN_DPMC_H_ |
| 8 | #define _BLACKFIN_DPMC_H_ | 10 | #define _BLACKFIN_DPMC_H_ |
| 9 | 11 | ||
diff --git a/arch/blackfin/include/asm/early_printk.h b/arch/blackfin/include/asm/early_printk.h index 53a762b6fcd2..68a910db8864 100644 --- a/arch/blackfin/include/asm/early_printk.h +++ b/arch/blackfin/include/asm/early_printk.h | |||
| @@ -1,27 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/early_printk.h | 2 | * function prototpyes for early printk |
| 3 | * Author: Robin Getz <rgetz@blackfin.uclinux.org | ||
| 4 | * | 3 | * |
| 5 | * Created: 14Aug2007 | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 6 | * Description: function prototpyes for early printk | ||
| 7 | * | 5 | * |
| 8 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 9 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 10 | * | ||
| 11 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2 of the License, or | ||
| 16 | * (at your option) any later version. | ||
| 17 | * | ||
| 18 | * This program is distributed in the hope that it will be useful, | ||
| 19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 21 | * GNU General Public License for more details. | ||
| 22 | */ | 7 | */ |
| 23 | 8 | ||
| 24 | |||
| 25 | #ifndef __ASM_EARLY_PRINTK_H__ | 9 | #ifndef __ASM_EARLY_PRINTK_H__ |
| 26 | #define __ASM_EARLY_PRINTK_H__ | 10 | #define __ASM_EARLY_PRINTK_H__ |
| 27 | 11 | ||
diff --git a/arch/blackfin/include/asm/elf.h b/arch/blackfin/include/asm/elf.h index c823e8ebbfa1..8e0764c81eaf 100644 --- a/arch/blackfin/include/asm/elf.h +++ b/arch/blackfin/include/asm/elf.h | |||
| @@ -1,4 +1,8 @@ | |||
| 1 | /* Changes made by LG Soft Oct 2004*/ | 1 | /* |
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 2 | 6 | ||
| 3 | #ifndef __ASMBFIN_ELF_H | 7 | #ifndef __ASMBFIN_ELF_H |
| 4 | #define __ASMBFIN_ELF_H | 8 | #define __ASMBFIN_ELF_H |
diff --git a/arch/blackfin/include/asm/entry.h b/arch/blackfin/include/asm/entry.h index 55b808fced71..a6886f6e4819 100644 --- a/arch/blackfin/include/asm/entry.h +++ b/arch/blackfin/include/asm/entry.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __BFIN_ENTRY_H | 7 | #ifndef __BFIN_ENTRY_H |
| 2 | #define __BFIN_ENTRY_H | 8 | #define __BFIN_ENTRY_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/fcntl.h b/arch/blackfin/include/asm/fcntl.h index 9c4037127857..8727b2b382f1 100644 --- a/arch/blackfin/include/asm/fcntl.h +++ b/arch/blackfin/include/asm/fcntl.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_FCNTL_H | 7 | #ifndef _BFIN_FCNTL_H |
| 2 | #define _BFIN_FCNTL_H | 8 | #define _BFIN_FCNTL_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/fixed_code.h b/arch/blackfin/include/asm/fixed_code.h index 32c4d495d847..73fe53e7fd24 100644 --- a/arch/blackfin/include/asm/fixed_code.h +++ b/arch/blackfin/include/asm/fixed_code.h | |||
| @@ -1,5 +1,11 @@ | |||
| 1 | /* This file defines the fixed addresses where userspace programs can find | 1 | /* |
| 2 | atomic code sequences. */ | 2 | * This file defines the fixed addresses where userspace programs |
| 3 | * can find atomic code sequences. | ||
| 4 | * | ||
| 5 | * Copyright 2007-2008 Analog Devices Inc. | ||
| 6 | * | ||
| 7 | * Licensed under the GPL-2 or later. | ||
| 8 | */ | ||
| 3 | 9 | ||
| 4 | #ifndef __BFIN_ASM_FIXED_CODE_H__ | 10 | #ifndef __BFIN_ASM_FIXED_CODE_H__ |
| 5 | #define __BFIN_ASM_FIXED_CODE_H__ | 11 | #define __BFIN_ASM_FIXED_CODE_H__ |
diff --git a/arch/blackfin/include/asm/flat.h b/arch/blackfin/include/asm/flat.h index 733a178d782d..c1314c56dd18 100644 --- a/arch/blackfin/include/asm/flat.h +++ b/arch/blackfin/include/asm/flat.h | |||
| @@ -1,8 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-blackfin/flat.h -- uClinux flat-format executables | 2 | * uClinux flat-format executables |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2003, | 4 | * Copyright 2003-2009 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Licensed under the GPL-2 | ||
| 6 | */ | 7 | */ |
| 7 | 8 | ||
| 8 | #ifndef __BLACKFIN_FLAT_H__ | 9 | #ifndef __BLACKFIN_FLAT_H__ |
diff --git a/arch/blackfin/include/asm/gpio.h b/arch/blackfin/include/asm/gpio.h index fe139619351f..5b44d05ca53e 100644 --- a/arch/blackfin/include/asm/gpio.h +++ b/arch/blackfin/include/asm/gpio.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/bfin_gpio.h | 2 | * Copyright 2006-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: Michael Hennerich (hennerich@blackfin.uclinux.org) | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #ifndef __ARCH_BLACKFIN_GPIO_H__ | 7 | #ifndef __ARCH_BLACKFIN_GPIO_H__ |
diff --git a/arch/blackfin/include/asm/hardirq.h b/arch/blackfin/include/asm/hardirq.h index 0b78b873df51..c078dd78d998 100644 --- a/arch/blackfin/include/asm/hardirq.h +++ b/arch/blackfin/include/asm/hardirq.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __BFIN_HARDIRQ_H | 7 | #ifndef __BFIN_HARDIRQ_H |
| 2 | #define __BFIN_HARDIRQ_H | 8 | #define __BFIN_HARDIRQ_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/io.h b/arch/blackfin/include/asm/io.h index 37053eca200e..d1f5029189a7 100644 --- a/arch/blackfin/include/asm/io.h +++ b/arch/blackfin/include/asm/io.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_IO_H | 7 | #ifndef _BFIN_IO_H |
| 2 | #define _BFIN_IO_H | 8 | #define _BFIN_IO_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/irq.h b/arch/blackfin/include/asm/irq.h index 42a15f5ce0d0..e7c0623f9091 100644 --- a/arch/blackfin/include/asm/irq.h +++ b/arch/blackfin/include/asm/irq.h | |||
| @@ -1,17 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * License. See the file COPYING in the main directory of this archive | 3 | * 2003 HuTao |
| 4 | * for more details. | 4 | * 2002 Arcturus Networks Inc. (www.arcturusnetworks.com |
| 5 | * Ted Ma <mated@sympatico.ca> | ||
| 5 | * | 6 | * |
| 6 | * Changed by HuTao Apr18, 2003 | 7 | * Licensed under the GPL-2 |
| 7 | * | ||
| 8 | * Copyright was missing when I got the code so took from MIPS arch ...MaTed--- | ||
| 9 | * Copyright (C) 1994 by Waldorf GMBH, written by Ralf Baechle | ||
| 10 | * Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001 by Ralf Baechle | ||
| 11 | * | ||
| 12 | * Adapted for BlackFin (ADI) by Ted Ma <mated@sympatico.ca> | ||
| 13 | * Copyright (c) 2002 Arcturus Networks Inc. (www.arcturusnetworks.com) | ||
| 14 | * Copyright (c) 2002 Lineo, Inc. <mattw@lineo.com> | ||
| 15 | */ | 8 | */ |
| 16 | 9 | ||
| 17 | #ifndef _BFIN_IRQ_H_ | 10 | #ifndef _BFIN_IRQ_H_ |
| @@ -19,6 +12,8 @@ | |||
| 19 | 12 | ||
| 20 | #include <linux/irqflags.h> | 13 | #include <linux/irqflags.h> |
| 21 | 14 | ||
| 15 | #include <mach/anomaly.h> | ||
| 16 | |||
| 22 | /* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h> */ | 17 | /* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h> */ |
| 23 | #include <mach/irq.h> | 18 | #include <mach/irq.h> |
| 24 | 19 | ||
diff --git a/arch/blackfin/include/asm/irq_handler.h b/arch/blackfin/include/asm/irq_handler.h index 7d9e2d3bbede..7fbe42307b9a 100644 --- a/arch/blackfin/include/asm/irq_handler.h +++ b/arch/blackfin/include/asm/irq_handler.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _IRQ_HANDLER_H | 7 | #ifndef _IRQ_HANDLER_H |
| 2 | #define _IRQ_HANDLER_H | 8 | #define _IRQ_HANDLER_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/l1layout.h b/arch/blackfin/include/asm/l1layout.h index 79dbefaa5bef..c87e68647a2b 100644 --- a/arch/blackfin/include/asm/l1layout.h +++ b/arch/blackfin/include/asm/l1layout.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * l1layout.h | ||
| 3 | * Defines a layout of L1 scratchpad memory that userspace can rely on. | 2 | * Defines a layout of L1 scratchpad memory that userspace can rely on. |
| 3 | * | ||
| 4 | * Copyright 2006-2008 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2 or later. | ||
| 4 | */ | 7 | */ |
| 5 | 8 | ||
| 6 | #ifndef _L1LAYOUT_H_ | 9 | #ifndef _L1LAYOUT_H_ |
diff --git a/arch/blackfin/include/asm/linkage.h b/arch/blackfin/include/asm/linkage.h index 5a822bb790f7..f7d6d47a048d 100644 --- a/arch/blackfin/include/asm/linkage.h +++ b/arch/blackfin/include/asm/linkage.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __ASM_LINKAGE_H | 7 | #ifndef __ASM_LINKAGE_H |
| 2 | #define __ASM_LINKAGE_H | 8 | #define __ASM_LINKAGE_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/mmu.h b/arch/blackfin/include/asm/mmu.h index dbfd686360e6..26f6b70b11e2 100644 --- a/arch/blackfin/include/asm/mmu.h +++ b/arch/blackfin/include/asm/mmu.h | |||
| @@ -1,8 +1,13 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * 2002 David McCullough <davidm@snapgear.com> | ||
| 4 | * | ||
| 5 | * Licensed under the GPL-2. | ||
| 6 | */ | ||
| 7 | |||
| 1 | #ifndef __MMU_H | 8 | #ifndef __MMU_H |
| 2 | #define __MMU_H | 9 | #define __MMU_H |
| 3 | 10 | ||
| 4 | /* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */ | ||
| 5 | |||
| 6 | struct sram_list_struct { | 11 | struct sram_list_struct { |
| 7 | struct sram_list_struct *next; | 12 | struct sram_list_struct *next; |
| 8 | void *addr; | 13 | void *addr; |
diff --git a/arch/blackfin/include/asm/mmu_context.h b/arch/blackfin/include/asm/mmu_context.h index 040410bb07e1..4a3be376ad5b 100644 --- a/arch/blackfin/include/asm/mmu_context.h +++ b/arch/blackfin/include/asm/mmu_context.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mmu_context.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #ifndef __BLACKFIN_MMU_CONTEXT_H__ | 7 | #ifndef __BLACKFIN_MMU_CONTEXT_H__ |
diff --git a/arch/blackfin/include/asm/module.h b/arch/blackfin/include/asm/module.h index e3128df139d6..9c1cfffddd9b 100644 --- a/arch/blackfin/include/asm/module.h +++ b/arch/blackfin/include/asm/module.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | Â * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | Â * | ||
| 4 | Â * Licensed under the GPL-2 or later. | ||
| 5 | Â */ | ||
| 6 | |||
| 1 | #ifndef _ASM_BFIN_MODULE_H | 7 | #ifndef _ASM_BFIN_MODULE_H |
| 2 | #define _ASM_BFIN_MODULE_H | 8 | #define _ASM_BFIN_MODULE_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/mutex.h b/arch/blackfin/include/asm/mutex.h index 5cc641c50834..f726e3a80ad0 100644 --- a/arch/blackfin/include/asm/mutex.h +++ b/arch/blackfin/include/asm/mutex.h | |||
| @@ -4,6 +4,10 @@ | |||
| 4 | * TODO: implement optimized primitives instead, or leave the generic | 4 | * TODO: implement optimized primitives instead, or leave the generic |
| 5 | * implementation in place, or pick the atomic_xchg() based generic | 5 | * implementation in place, or pick the atomic_xchg() based generic |
| 6 | * implementation. (see asm-generic/mutex-xchg.h for details) | 6 | * implementation. (see asm-generic/mutex-xchg.h for details) |
| 7 | * | ||
| 8 | * Copyright 2006-2009 Analog Devices Inc. | ||
| 9 | * | ||
| 10 | * Licensed under the GPL-2 or later. | ||
| 7 | */ | 11 | */ |
| 8 | 12 | ||
| 9 | #ifndef _ASM_MUTEX_H | 13 | #ifndef _ASM_MUTEX_H |
diff --git a/arch/blackfin/include/asm/nand.h b/arch/blackfin/include/asm/nand.h index afbaafa793f1..3ae8b569edfc 100644 --- a/arch/blackfin/include/asm/nand.h +++ b/arch/blackfin/include/asm/nand.h | |||
| @@ -1,13 +1,9 @@ | |||
| 1 | /* linux/include/asm-blackfin/nand.h | 1 | /* |
| 2 | * | ||
| 3 | * Copyright (c) 2007 Analog Devices, Inc. | ||
| 4 | * Bryan Wu <bryan.wu@analog.com> | ||
| 5 | * | ||
| 6 | * BF5XX - NAND flash controller platfrom_device info | 2 | * BF5XX - NAND flash controller platfrom_device info |
| 7 | * | 3 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 4 | * Copyright 2007-2008 Analog Devices, Inc. |
| 9 | * it under the terms of the GNU General Public License version 2 as | 5 | * |
| 10 | * published by the Free Software Foundation. | 6 | * Licensed under the GPL-2 |
| 11 | */ | 7 | */ |
| 12 | 8 | ||
| 13 | /* struct bf5xx_nand_platform | 9 | /* struct bf5xx_nand_platform |
diff --git a/arch/blackfin/include/asm/page.h b/arch/blackfin/include/asm/page.h index 29dcf75c6112..944a07c6cfd6 100644 --- a/arch/blackfin/include/asm/page.h +++ b/arch/blackfin/include/asm/page.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | Â * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | Â * | ||
| 4 | Â * Licensed under the GPL-2 or later. | ||
| 5 | Â */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_PAGE_H | 7 | #ifndef _BLACKFIN_PAGE_H |
| 2 | #define _BLACKFIN_PAGE_H | 8 | #define _BLACKFIN_PAGE_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/page_offset.h b/arch/blackfin/include/asm/page_offset.h index cbaff24b4b25..d06a89b89d20 100644 --- a/arch/blackfin/include/asm/page_offset.h +++ b/arch/blackfin/include/asm/page_offset.h | |||
| @@ -1,5 +1,10 @@ | |||
| 1 | 1 | /* | |
| 2 | /* This handles the memory map.. */ | 2 | * This handles the memory map |
| 3 | * | ||
| 4 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2 or later. | ||
| 7 | */ | ||
| 3 | 8 | ||
| 4 | #ifdef CONFIG_BLACKFIN | 9 | #ifdef CONFIG_BLACKFIN |
| 5 | #define PAGE_OFFSET_RAW 0x00000000 | 10 | #define PAGE_OFFSET_RAW 0x00000000 |
diff --git a/arch/blackfin/include/asm/pda.h b/arch/blackfin/include/asm/pda.h index a6f95695731d..d49bb261d9b7 100644 --- a/arch/blackfin/include/asm/pda.h +++ b/arch/blackfin/include/asm/pda.h | |||
| @@ -1,23 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/include/asm/pda.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Author: Philippe Gerum <rpm@xenomai.org> | 3 | * Philippe Gerum <rpm@xenomai.org> |
| 4 | * | 4 | * |
| 5 | * Copyright 2007 Analog Devices Inc. | 5 | * Licensed under the GPL-2 or later. |
| 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; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, see the file COPYING, or write | ||
| 19 | * to the Free Software Foundation, Inc., | ||
| 20 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 21 | */ | 6 | */ |
| 22 | 7 | ||
| 23 | #ifndef _ASM_BLACKFIN_PDA_H | 8 | #ifndef _ASM_BLACKFIN_PDA_H |
diff --git a/arch/blackfin/include/asm/pgtable.h b/arch/blackfin/include/asm/pgtable.h index 783c8f7f8f8c..821c699c2238 100644 --- a/arch/blackfin/include/asm/pgtable.h +++ b/arch/blackfin/include/asm/pgtable.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_PGTABLE_H | 7 | #ifndef _BLACKFIN_PGTABLE_H |
| 2 | #define _BLACKFIN_PGTABLE_H | 8 | #define _BLACKFIN_PGTABLE_H |
| 3 | 9 | ||
| @@ -92,6 +98,12 @@ extern unsigned int kobjsize(const void *objp); | |||
| 92 | #define VMALLOC_START 0 | 98 | #define VMALLOC_START 0 |
| 93 | #define VMALLOC_END 0xffffffff | 99 | #define VMALLOC_END 0xffffffff |
| 94 | 100 | ||
| 101 | /* provide a special get_unmapped_area for framebuffer mmaps of nommu */ | ||
| 102 | extern unsigned long get_fb_unmapped_area(struct file *filp, unsigned long, | ||
| 103 | unsigned long, unsigned long, | ||
| 104 | unsigned long); | ||
| 105 | #define HAVE_ARCH_FB_UNMAPPED_AREA | ||
| 106 | |||
| 95 | #include <asm-generic/pgtable.h> | 107 | #include <asm-generic/pgtable.h> |
| 96 | 108 | ||
| 97 | #endif /* _BLACKFIN_PGTABLE_H */ | 109 | #endif /* _BLACKFIN_PGTABLE_H */ |
diff --git a/arch/blackfin/include/asm/poll.h b/arch/blackfin/include/asm/poll.h index a0556671357b..072d8966c5c3 100644 --- a/arch/blackfin/include/asm/poll.h +++ b/arch/blackfin/include/asm/poll.h | |||
| @@ -1,3 +1,10 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | * | ||
| 6 | */ | ||
| 7 | |||
| 1 | #ifndef __BFIN_POLL_H | 8 | #ifndef __BFIN_POLL_H |
| 2 | #define __BFIN_POLL_H | 9 | #define __BFIN_POLL_H |
| 3 | 10 | ||
diff --git a/arch/blackfin/include/asm/portmux.h b/arch/blackfin/include/asm/portmux.h index 88eb5c07cc24..edd8ef3a3788 100644 --- a/arch/blackfin/include/asm/portmux.h +++ b/arch/blackfin/include/asm/portmux.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Common header file for blackfin family of processors. | 2 | * Common header file for Blackfin family of processors |
| 3 | * | 3 | * |
| 4 | Â * Copyright 2007-2008 Analog Devices Inc. | ||
| 5 | Â * | ||
| 6 | Â * Licensed under the GPL-2 or later. | ||
| 4 | */ | 7 | */ |
| 5 | 8 | ||
| 6 | #ifndef _PORTMUX_H_ | 9 | #ifndef _PORTMUX_H_ |
diff --git a/arch/blackfin/include/asm/posix_types.h b/arch/blackfin/include/asm/posix_types.h index 80c9d64eb26c..41bc1875c4d7 100644 --- a/arch/blackfin/include/asm/posix_types.h +++ b/arch/blackfin/include/asm/posix_types.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __ARCH_BFIN_POSIX_TYPES_H | 7 | #ifndef __ARCH_BFIN_POSIX_TYPES_H |
| 2 | #define __ARCH_BFIN_POSIX_TYPES_H | 8 | #define __ARCH_BFIN_POSIX_TYPES_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/processor.h b/arch/blackfin/include/asm/processor.h index a36ad8dac068..aea880274de7 100644 --- a/arch/blackfin/include/asm/processor.h +++ b/arch/blackfin/include/asm/processor.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __ASM_BFIN_PROCESSOR_H | 7 | #ifndef __ASM_BFIN_PROCESSOR_H |
| 2 | #define __ASM_BFIN_PROCESSOR_H | 8 | #define __ASM_BFIN_PROCESSOR_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/ptrace.h b/arch/blackfin/include/asm/ptrace.h index e3f086dc7268..27290c955a7a 100644 --- a/arch/blackfin/include/asm/ptrace.h +++ b/arch/blackfin/include/asm/ptrace.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_PTRACE_H | 7 | #ifndef _BFIN_PTRACE_H |
| 2 | #define _BFIN_PTRACE_H | 8 | #define _BFIN_PTRACE_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/sections.h b/arch/blackfin/include/asm/sections.h index ae4dae1e370b..1f5381fbb4a7 100644 --- a/arch/blackfin/include/asm/sections.h +++ b/arch/blackfin/include/asm/sections.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | Â * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | Â * | ||
| 4 | Â * Licensed under the GPL-2 or later. | ||
| 5 | Â */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_SECTIONS_H | 7 | #ifndef _BLACKFIN_SECTIONS_H |
| 2 | #define _BLACKFIN_SECTIONS_H | 8 | #define _BLACKFIN_SECTIONS_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/segment.h b/arch/blackfin/include/asm/segment.h index 02cfd09b5a99..f8e1984ffc7e 100644 --- a/arch/blackfin/include/asm/segment.h +++ b/arch/blackfin/include/asm/segment.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_SEGMENT_H | 7 | #ifndef _BFIN_SEGMENT_H |
| 2 | #define _BFIN_SEGMENT_H | 8 | #define _BFIN_SEGMENT_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/sigcontext.h b/arch/blackfin/include/asm/sigcontext.h index ce00b03c2775..ce4081a4d815 100644 --- a/arch/blackfin/include/asm/sigcontext.h +++ b/arch/blackfin/include/asm/sigcontext.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | Â * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | Â * | ||
| 4 | Â * Licensed under the GPL-2 or later. | ||
| 5 | Â */ | ||
| 6 | |||
| 1 | #ifndef _ASM_BLACKFIN_SIGCONTEXT_H | 7 | #ifndef _ASM_BLACKFIN_SIGCONTEXT_H |
| 2 | #define _ASM_BLACKFIN_SIGCONTEXT_H | 8 | #define _ASM_BLACKFIN_SIGCONTEXT_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/siginfo.h b/arch/blackfin/include/asm/siginfo.h index eca4565cea37..3e81306394e2 100644 --- a/arch/blackfin/include/asm/siginfo.h +++ b/arch/blackfin/include/asm/siginfo.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_SIGINFO_H | 7 | #ifndef _BFIN_SIGINFO_H |
| 2 | #define _BFIN_SIGINFO_H | 8 | #define _BFIN_SIGINFO_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/smp.h b/arch/blackfin/include/asm/smp.h index 118deeeae7c0..6a0fe94b84a6 100644 --- a/arch/blackfin/include/asm/smp.h +++ b/arch/blackfin/include/asm/smp.h | |||
| @@ -1,23 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/include/asm/smp.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Author: Philippe Gerum <rpm@xenomai.org> | 3 | * Philippe Gerum <rpm@xenomai.org> |
| 4 | * | 4 | * |
| 5 | * Copyright 2007 Analog Devices Inc. | 5 | * Licensed under the GPL-2 or later. |
| 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; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, see the file COPYING, or write | ||
| 19 | * to the Free Software Foundation, Inc., | ||
| 20 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 21 | */ | 6 | */ |
| 22 | 7 | ||
| 23 | #ifndef __ASM_BLACKFIN_SMP_H | 8 | #ifndef __ASM_BLACKFIN_SMP_H |
diff --git a/arch/blackfin/include/asm/spinlock.h b/arch/blackfin/include/asm/spinlock.h index d6ff4b59fcb1..b0c7f0ee4b03 100644 --- a/arch/blackfin/include/asm/spinlock.h +++ b/arch/blackfin/include/asm/spinlock.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | Â * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | Â * | ||
| 4 | Â * Licensed under the GPL-2 or later. | ||
| 5 | Â */ | ||
| 6 | |||
| 1 | #ifndef __BFIN_SPINLOCK_H | 7 | #ifndef __BFIN_SPINLOCK_H |
| 2 | #define __BFIN_SPINLOCK_H | 8 | #define __BFIN_SPINLOCK_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/spinlock_types.h b/arch/blackfin/include/asm/spinlock_types.h index b1e3c4c7b382..be75762c0610 100644 --- a/arch/blackfin/include/asm/spinlock_types.h +++ b/arch/blackfin/include/asm/spinlock_types.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __ASM_SPINLOCK_TYPES_H | 7 | #ifndef __ASM_SPINLOCK_TYPES_H |
| 2 | #define __ASM_SPINLOCK_TYPES_H | 8 | #define __ASM_SPINLOCK_TYPES_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/stat.h b/arch/blackfin/include/asm/stat.h index d2b6f11ec231..2e27665c4e91 100644 --- a/arch/blackfin/include/asm/stat.h +++ b/arch/blackfin/include/asm/stat.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_STAT_H | 7 | #ifndef _BFIN_STAT_H |
| 2 | #define _BFIN_STAT_H | 8 | #define _BFIN_STAT_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/string.h b/arch/blackfin/include/asm/string.h index 321f4d96e4ae..d7f0ccb418c3 100644 --- a/arch/blackfin/include/asm/string.h +++ b/arch/blackfin/include/asm/string.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_STRING_H_ | 7 | #ifndef _BLACKFIN_STRING_H_ |
| 2 | #define _BLACKFIN_STRING_H_ | 8 | #define _BLACKFIN_STRING_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/swab.h b/arch/blackfin/include/asm/swab.h index d442113de515..89de6507ca2b 100644 --- a/arch/blackfin/include/asm/swab.h +++ b/arch/blackfin/include/asm/swab.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_SWAB_H | 7 | #ifndef _BLACKFIN_SWAB_H |
| 2 | #define _BLACKFIN_SWAB_H | 8 | #define _BLACKFIN_SWAB_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/system.h b/arch/blackfin/include/asm/system.h index 85e8f16cf8c2..dde19b1d25f5 100644 --- a/arch/blackfin/include/asm/system.h +++ b/arch/blackfin/include/asm/system.h | |||
| @@ -1,34 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm/system.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | 3 | * Tony Kou (tonyko@lineo.ca) |
| 4 | * Author: Tony Kou (tonyko@lineo.ca) | ||
| 5 | * Copyright (c) 2002 Arcturus Networks Inc. | ||
| 6 | * (www.arcturusnetworks.com) | ||
| 7 | * Copyright (c) 2003 Metrowerks (www.metrowerks.com) | ||
| 8 | * Copyright (c) 2004 Analog Device Inc. | ||
| 9 | * Created: 25Jan2001 - Tony Kou | ||
| 10 | * Description: system.h include file | ||
| 11 | * | 4 | * |
| 12 | * Modified: 22Sep2006 - Robin Getz | 5 | * Licensed under the GPL-2 or later |
| 13 | * - move include blackfin.h down, so I can get access to | ||
| 14 | * irq functions in other include files. | ||
| 15 | * | ||
| 16 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 17 | * | ||
| 18 | * This program is free software; you can redistribute it and/or modify | ||
| 19 | * it under the terms of the GNU General Public License as published by | ||
| 20 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 21 | * any later version. | ||
| 22 | * | ||
| 23 | * This program is distributed in the hope that it will be useful, | ||
| 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 26 | * GNU General Public License for more details. | ||
| 27 | * | ||
| 28 | * You should have received a copy of the GNU General Public License | ||
| 29 | * along with this program; see the file COPYING. | ||
| 30 | * If not, write to the Free Software Foundation, | ||
| 31 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 32 | */ | 6 | */ |
| 33 | 7 | ||
| 34 | #ifndef _BLACKFIN_SYSTEM_H | 8 | #ifndef _BLACKFIN_SYSTEM_H |
diff --git a/arch/blackfin/include/asm/thread_info.h b/arch/blackfin/include/asm/thread_info.h index 2bbfdd950afc..afb3a8626380 100644 --- a/arch/blackfin/include/asm/thread_info.h +++ b/arch/blackfin/include/asm/thread_info.h | |||
| @@ -1,27 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/thread_info.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: include/asm-m68knommu/thread_info.h | ||
| 4 | * Author: LG Soft India | ||
| 5 | * Copyright (C) 2004-2005 Analog Devices Inc. | ||
| 6 | * Created: Tue Sep 21 2004 | ||
| 7 | * Description: Blackfin low-level thread information | ||
| 8 | * Modified: | ||
| 9 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 10 | * | 3 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 4 | * Licensed under the GPL-2 or later. |
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 14 | * any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; see the file COPYING. | ||
| 23 | * If not, write to the Free Software Foundation, | ||
| 24 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 25 | */ | 5 | */ |
| 26 | 6 | ||
| 27 | #ifndef _ASM_THREAD_INFO_H | 7 | #ifndef _ASM_THREAD_INFO_H |
diff --git a/arch/blackfin/include/asm/tlb.h b/arch/blackfin/include/asm/tlb.h index 89a12ee916d8..a74ae08af1a7 100644 --- a/arch/blackfin/include/asm/tlb.h +++ b/arch/blackfin/include/asm/tlb.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BLACKFIN_TLB_H | 7 | #ifndef _BLACKFIN_TLB_H |
| 2 | #define _BLACKFIN_TLB_H | 8 | #define _BLACKFIN_TLB_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/include/asm/trace.h b/arch/blackfin/include/asm/trace.h index 312b596b9731..609ad3c84189 100644 --- a/arch/blackfin/include/asm/trace.h +++ b/arch/blackfin/include/asm/trace.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Common header file for blackfin family of processors. | 2 | * header file for hardware trace functions |
| 3 | * | 3 | * |
| 4 | * Copyright 2007-2008 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2 or later. | ||
| 4 | */ | 7 | */ |
| 5 | 8 | ||
| 6 | #ifndef _BLACKFIN_TRACE_ | 9 | #ifndef _BLACKFIN_TRACE_ |
diff --git a/arch/blackfin/include/asm/traps.h b/arch/blackfin/include/asm/traps.h index 3cdc454cde23..9fe0da612c09 100644 --- a/arch/blackfin/include/asm/traps.h +++ b/arch/blackfin/include/asm/traps.h | |||
| @@ -1,13 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/include/asm/traps.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * 2001 Lineo, Inc | ||
| 4 | * Tony Kou | ||
| 5 | * 1993 Hamish Macdonald | ||
| 3 | * | 6 | * |
| 4 | * Copyright (C) 1993 Hamish Macdonald | 7 | * Licensed under the GPL-2 |
| 5 | * | ||
| 6 | * Lineo, Inc Jul 2001 Tony Kou | ||
| 7 | * | ||
| 8 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 9 | * License. See the file COPYING in the main directory of this archive | ||
| 10 | * for more details. | ||
| 11 | */ | 8 | */ |
| 12 | 9 | ||
| 13 | #ifndef _BFIN_TRAPS_H | 10 | #ifndef _BFIN_TRAPS_H |
diff --git a/arch/blackfin/include/asm/uaccess.h b/arch/blackfin/include/asm/uaccess.h index 2f469a1f80fb..c03b8532aad3 100644 --- a/arch/blackfin/include/asm/uaccess.h +++ b/arch/blackfin/include/asm/uaccess.h | |||
| @@ -1,4 +1,7 @@ | |||
| 1 | /* Changes made by Lineo Inc. May 2001 | 1 | /* |
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 2 | * | 5 | * |
| 3 | * Based on: include/asm-m68knommu/uaccess.h | 6 | * Based on: include/asm-m68knommu/uaccess.h |
| 4 | */ | 7 | */ |
diff --git a/arch/blackfin/include/asm/unistd.h b/arch/blackfin/include/asm/unistd.h index 02b1529dad57..779be02a910a 100644 --- a/arch/blackfin/include/asm/unistd.h +++ b/arch/blackfin/include/asm/unistd.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef __ASM_BFIN_UNISTD_H | 7 | #ifndef __ASM_BFIN_UNISTD_H |
| 2 | #define __ASM_BFIN_UNISTD_H | 8 | #define __ASM_BFIN_UNISTD_H |
| 3 | /* | 9 | /* |
diff --git a/arch/blackfin/kernel/asm-offsets.c b/arch/blackfin/kernel/asm-offsets.c index f05d1b99b0ef..bd32c09b9349 100644 --- a/arch/blackfin/kernel/asm-offsets.c +++ b/arch/blackfin/kernel/asm-offsets.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/asm-offsets.c | 2 | * generate definitions needed by assembly language modules |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: generate definitions needed by assembly language modules. | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/stddef.h> | 9 | #include <linux/stddef.h> |
diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c index 384868dedac3..1f170216d2f9 100644 --- a/arch/blackfin/kernel/bfin_dma_5xx.c +++ b/arch/blackfin/kernel/bfin_dma_5xx.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * bfin_dma_5xx.c - Blackfin DMA implementation | 2 | * bfin_dma_5xx.c - Blackfin DMA implementation |
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2008 Analog Devices Inc. | 4 | * Copyright 2004-2008 Analog Devices Inc. |
| 5 | * | ||
| 5 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 6 | */ | 7 | */ |
| 7 | 8 | ||
diff --git a/arch/blackfin/kernel/bfin_gpio.c b/arch/blackfin/kernel/bfin_gpio.c index fc4681c0170e..22705eeff34f 100644 --- a/arch/blackfin/kernel/bfin_gpio.c +++ b/arch/blackfin/kernel/bfin_gpio.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/bfin_gpio.c | 2 | * GPIO Abstraction Layer |
| 3 | * Based on: | ||
| 4 | * Author: Michael Hennerich (hennerich@blackfin.uclinux.org) | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2006-2009 Analog Devices Inc. |
| 7 | * Description: GPIO Abstraction Layer | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later |
| 10 | * Copyright 2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/delay.h> | 9 | #include <linux/delay.h> |
diff --git a/arch/blackfin/kernel/cplb-mpu/cplbinit.c b/arch/blackfin/kernel/cplb-mpu/cplbinit.c index 36193eed9a1f..f7b9cdce8239 100644 --- a/arch/blackfin/kernel/cplb-mpu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-mpu/cplbinit.c | |||
| @@ -1,25 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Blackfin CPLB initialization | 2 | * Blackfin CPLB initialization |
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2007 Analog Devices Inc. | 4 | * Copyright 2008-2009 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 6 | * Licensed under the GPL-2 or later. |
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, see the file COPYING, or write | ||
| 20 | * to the Free Software Foundation, Inc., | ||
| 21 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 22 | */ | 7 | */ |
| 8 | |||
| 23 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 24 | 10 | ||
| 25 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/kernel/cplb-mpu/cplbmgr.c b/arch/blackfin/kernel/cplb-mpu/cplbmgr.c index 8e1e9e9e9632..69e0e530d70f 100644 --- a/arch/blackfin/kernel/cplb-mpu/cplbmgr.c +++ b/arch/blackfin/kernel/cplb-mpu/cplbmgr.c | |||
| @@ -1,22 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Blackfin CPLB exception handling. | 2 | * Blackfin CPLB exception handling for when MPU in on |
| 3 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 4 | * | 3 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 4 | * Copyright 2008-2009 Analog Devices Inc. |
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | 5 | * |
| 10 | * This program is distributed in the hope that it will be useful, | 6 | * Licensed under the GPL-2 or later. |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, see the file COPYING, or write | ||
| 17 | * to the Free Software Foundation, Inc., | ||
| 18 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 19 | */ | 7 | */ |
| 8 | |||
| 20 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 21 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
| 22 | 11 | ||
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 5d8ad503f82a..fd9a2f31e686 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c | |||
| @@ -1,24 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Blackfin CPLB initialization | 2 | * Blackfin CPLB initialization |
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2007 Analog Devices Inc. | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 6 | * Licensed under the GPL-2 or later. |
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, see the file COPYING, or write | ||
| 20 | * to the Free Software Foundation, Inc., | ||
| 21 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 22 | */ | 7 | */ |
| 23 | 8 | ||
| 24 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbmgr.c b/arch/blackfin/kernel/cplb-nompu/cplbmgr.c index d9ea46c6e41a..5b88861d6183 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbmgr.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbmgr.c | |||
| @@ -1,26 +1,14 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/cplb-nompu-c/cplbmgr.c | ||
| 3 | * Based on: arch/blackfin/kernel/cplb-mpu/cplbmgr.c | 2 | * Based on: arch/blackfin/kernel/cplb-mpu/cplbmgr.c |
| 4 | * Author: Michael McTernan <mmcternan@airvana.com> | 3 | * Author: Michael McTernan <mmcternan@airvana.com> |
| 5 | * | 4 | * |
| 6 | * Created: 01Nov2008 | ||
| 7 | * Description: CPLB miss handler. | 5 | * Description: CPLB miss handler. |
| 8 | * | 6 | * |
| 9 | * Modified: | 7 | * Modified: |
| 10 | * Copyright 2008 Airvana Inc. | 8 | * Copyright 2008 Airvana Inc. |
| 11 | * Copyright 2004-2007 Analog Devices Inc. | 9 | * Copyright 2008-2009 Analog Devices Inc. |
| 12 | * | 10 | * |
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 11 | * Licensed under the GPL-2 or later |
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | */ | 12 | */ |
| 25 | 13 | ||
| 26 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
diff --git a/arch/blackfin/kernel/cplbinfo.c b/arch/blackfin/kernel/cplbinfo.c index 64d78300dd08..0bdaa517a501 100644 --- a/arch/blackfin/kernel/cplbinfo.c +++ b/arch/blackfin/kernel/cplbinfo.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * arch/blackfin/kernel/cplbinfo.c - display CPLB status | 2 | * arch/blackfin/kernel/cplbinfo.c - display CPLB status |
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2008 Analog Devices Inc. | 4 | * Copyright 2004-2008 Analog Devices Inc. |
| 5 | * | ||
| 5 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 6 | */ | 7 | */ |
| 7 | 8 | ||
| @@ -111,24 +112,21 @@ static const struct seq_operations cplbinfo_sops = { | |||
| 111 | .show = cplbinfo_show, | 112 | .show = cplbinfo_show, |
| 112 | }; | 113 | }; |
| 113 | 114 | ||
| 115 | #define CPLBINFO_DCPLB_FLAG 0x80000000 | ||
| 116 | |||
| 114 | static int cplbinfo_open(struct inode *inode, struct file *file) | 117 | static int cplbinfo_open(struct inode *inode, struct file *file) |
| 115 | { | 118 | { |
| 116 | char buf[256], *path, *p; | 119 | struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); |
| 120 | char cplb_type; | ||
| 117 | unsigned int cpu; | 121 | unsigned int cpu; |
| 118 | char *s_cpu, *s_cplb; | ||
| 119 | int ret; | 122 | int ret; |
| 120 | struct seq_file *m; | 123 | struct seq_file *m; |
| 121 | struct cplbinfo_data *cdata; | 124 | struct cplbinfo_data *cdata; |
| 122 | 125 | ||
| 123 | path = d_path(&file->f_path, buf, sizeof(buf)); | 126 | cpu = (unsigned int)pde->data; |
| 124 | if (IS_ERR(path)) | 127 | cplb_type = cpu & CPLBINFO_DCPLB_FLAG ? 'D' : 'I'; |
| 125 | return PTR_ERR(path); | 128 | cpu &= ~CPLBINFO_DCPLB_FLAG; |
| 126 | s_cpu = strstr(path, "/cpu"); | ||
| 127 | s_cplb = strrchr(path, '/'); | ||
| 128 | if (!s_cpu || !s_cplb) | ||
| 129 | return -EINVAL; | ||
| 130 | 129 | ||
| 131 | cpu = simple_strtoul(s_cpu + 4, &p, 10); | ||
| 132 | if (!cpu_online(cpu)) | 130 | if (!cpu_online(cpu)) |
| 133 | return -ENODEV; | 131 | return -ENODEV; |
| 134 | 132 | ||
| @@ -139,7 +137,7 @@ static int cplbinfo_open(struct inode *inode, struct file *file) | |||
| 139 | cdata = m->private; | 137 | cdata = m->private; |
| 140 | 138 | ||
| 141 | cdata->pos = 0; | 139 | cdata->pos = 0; |
| 142 | cdata->cplb_type = toupper(s_cplb[1]); | 140 | cdata->cplb_type = cplb_type; |
| 143 | cplbinfo_seq_init(cdata, cpu); | 141 | cplbinfo_seq_init(cdata, cpu); |
| 144 | 142 | ||
| 145 | return 0; | 143 | return 0; |
| @@ -168,8 +166,10 @@ static int __init cplbinfo_init(void) | |||
| 168 | if (!cpu_dir) | 166 | if (!cpu_dir) |
| 169 | return -ENOMEM; | 167 | return -ENOMEM; |
| 170 | 168 | ||
| 171 | proc_create("icplb", S_IRUGO, cpu_dir, &cplbinfo_fops); | 169 | proc_create_data("icplb", S_IRUGO, cpu_dir, &cplbinfo_fops, |
| 172 | proc_create("dcplb", S_IRUGO, cpu_dir, &cplbinfo_fops); | 170 | (void *)cpu); |
| 171 | proc_create_data("dcplb", S_IRUGO, cpu_dir, &cplbinfo_fops, | ||
| 172 | (void *)(cpu | CPLBINFO_DCPLB_FLAG)); | ||
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | return 0; | 175 | return 0; |
diff --git a/arch/blackfin/kernel/dma-mapping.c b/arch/blackfin/kernel/dma-mapping.c index 2f62a9f4058a..e74e74d7733f 100644 --- a/arch/blackfin/kernel/dma-mapping.c +++ b/arch/blackfin/kernel/dma-mapping.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/dma-mapping.c | 2 | * Dynamic DMA mapping support |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2005-2009 Analog Devices Inc. |
| 7 | * Description: Dynamic DMA mapping support. | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/types.h> | 9 | #include <linux/types.h> |
diff --git a/arch/blackfin/kernel/early_printk.c b/arch/blackfin/kernel/early_printk.c index 931c78b5ea1f..84ed8375113c 100644 --- a/arch/blackfin/kernel/early_printk.c +++ b/arch/blackfin/kernel/early_printk.c | |||
| @@ -1,25 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/early_printk.c | 2 | * allow a console to be used for early printk |
| 3 | * Based on: arch/x86_64/kernel/early_printk.c | 3 | * derived from arch/x86/kernel/early_printk.c |
| 4 | * Author: Robin Getz <rgetz@blackfin.uclinux.org | ||
| 5 | * | 4 | * |
| 6 | * Created: 14Aug2007 | 5 | * Copyright 2007-2009 Analog Devices Inc. |
| 7 | * Description: allow a console to be used for early printk | ||
| 8 | * | 6 | * |
| 9 | * Modified: | 7 | * Licensed under the GPL-2 |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | */ | 8 | */ |
| 24 | 9 | ||
| 25 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
diff --git a/arch/blackfin/kernel/entry.S b/arch/blackfin/kernel/entry.S index 3f8769b7db54..f27dc2292e1b 100644 --- a/arch/blackfin/kernel/entry.S +++ b/arch/blackfin/kernel/entry.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/entry.S | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/kernel/fixed_code.S b/arch/blackfin/kernel/fixed_code.S index 0d2d9e0968c8..0565917f23ba 100644 --- a/arch/blackfin/kernel/fixed_code.S +++ b/arch/blackfin/kernel/fixed_code.S | |||
| @@ -6,7 +6,12 @@ | |||
| 6 | * These are aligned to 16 bytes, so that we have some space to replace | 6 | * These are aligned to 16 bytes, so that we have some space to replace |
| 7 | * these sequences with something else (e.g. kernel traps if we ever do | 7 | * these sequences with something else (e.g. kernel traps if we ever do |
| 8 | * BF561 SMP). | 8 | * BF561 SMP). |
| 9 | * | ||
| 10 | * Copyright 2007-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Licensed under the GPL-2 or later. | ||
| 9 | */ | 13 | */ |
| 14 | |||
| 10 | #include <linux/linkage.h> | 15 | #include <linux/linkage.h> |
| 11 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 12 | #include <linux/unistd.h> | 17 | #include <linux/unistd.h> |
diff --git a/arch/blackfin/kernel/flat.c b/arch/blackfin/kernel/flat.c index d188b2430536..a88daddbf074 100644 --- a/arch/blackfin/kernel/flat.c +++ b/arch/blackfin/kernel/flat.c | |||
| @@ -1,21 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/blackfin/kernel/flat.c | 2 | * Copyright 2007 Analog Devices Inc. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2007 Analog Devices, Inc. | 4 | * Licensed under the GPL-2. |
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | 5 | */ |
| 20 | 6 | ||
| 21 | #include <linux/module.h> | 7 | #include <linux/module.h> |
diff --git a/arch/blackfin/kernel/init_task.c b/arch/blackfin/kernel/init_task.c index c26c34de9f3c..118c5b9dedac 100644 --- a/arch/blackfin/kernel/init_task.c +++ b/arch/blackfin/kernel/init_task.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/init_task.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/mm.h> | 7 | #include <linux/mm.h> |
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c index 4b5fd36187d9..db9f9c91f11f 100644 --- a/arch/blackfin/kernel/irqchip.c +++ b/arch/blackfin/kernel/irqchip.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/irqchip.c | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/kernel_stat.h> | 7 | #include <linux/kernel_stat.h> |
diff --git a/arch/blackfin/kernel/module.c b/arch/blackfin/kernel/module.c index 67fc7a56c865..a6dfa6b71e63 100644 --- a/arch/blackfin/kernel/module.c +++ b/arch/blackfin/kernel/module.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/module.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #define pr_fmt(fmt) "module %s: " fmt | 7 | #define pr_fmt(fmt) "module %s: " fmt |
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index f5b286189647..430ae39456e8 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/process.c | 2 | * Blackfin architecture-dependent process handling |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: Blackfin architecture-dependent process handling. | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c index 30f4828277ad..0982b5d5af10 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c | |||
| @@ -1,30 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/ptrace.c | 2 | * linux/kernel/ptrace.c is by Ross Biro 1/23/92, edited by Linus Torvalds |
| 3 | * Based on: Taken from linux/kernel/ptrace.c | 3 | * these modifications are Copyright 2004-2009 Analog Devices Inc. |
| 4 | * Author: linux/kernel/ptrace.c is by Ross Biro 1/23/92, edited by Linus Torvalds | ||
| 5 | * | 4 | * |
| 6 | * Created: 1/23/92 | 5 | * Licensed under the GPL-2 |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 6 | */ |
| 29 | 7 | ||
| 30 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 369535b61ed1..c202a44d1416 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
| @@ -1,9 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/blackfin/kernel/setup.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * | ||
| 4 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | 3 | * |
| 8 | * Licensed under the GPL-2 or later. | 4 | * Licensed under the GPL-2 or later. |
| 9 | */ | 5 | */ |
diff --git a/arch/blackfin/kernel/shadow_console.c b/arch/blackfin/kernel/shadow_console.c index 8b8c7107a162..557e9fef406a 100644 --- a/arch/blackfin/kernel/shadow_console.c +++ b/arch/blackfin/kernel/shadow_console.c | |||
| @@ -4,8 +4,6 @@ | |||
| 4 | * | 4 | * |
| 5 | * Copyright 2009 Analog Devices Inc. | 5 | * Copyright 2009 Analog Devices Inc. |
| 6 | * | 6 | * |
| 7 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 8 | * | ||
| 9 | * Licensed under the GPL-2 or later. | 7 | * Licensed under the GPL-2 or later. |
| 10 | */ | 8 | */ |
| 11 | 9 | ||
diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c index dbc3bbf846be..9d90c18fab23 100644 --- a/arch/blackfin/kernel/signal.c +++ b/arch/blackfin/kernel/signal.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/signal.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/signal.h> | 7 | #include <linux/signal.h> |
diff --git a/arch/blackfin/kernel/sys_bfin.c b/arch/blackfin/kernel/sys_bfin.c index 3da60fb13ce4..afcef129d4e8 100644 --- a/arch/blackfin/kernel/sys_bfin.c +++ b/arch/blackfin/kernel/sys_bfin.c | |||
| @@ -1,32 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/sys_bfin.c | 2 | * contains various random system calls that have a non-standard |
| 3 | * Based on: | 3 | * calling sequence on the Linux/Blackfin platform. |
| 4 | * Author: | ||
| 5 | * | 4 | * |
| 6 | * Created: | 5 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: This file contains various random system calls that | ||
| 8 | * have a non-standard calling sequence on the Linux/bfin | ||
| 9 | * platform. | ||
| 10 | * | 6 | * |
| 11 | * Modified: | 7 | * Licensed under the GPL-2 or later |
| 12 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2 of the License, or | ||
| 19 | * (at your option) any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; if not, see the file COPYING, or write | ||
| 28 | * to the Free Software Foundation, Inc., | ||
| 29 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 30 | */ | 8 | */ |
| 31 | 9 | ||
| 32 | #include <linux/spinlock.h> | 10 | #include <linux/spinlock.h> |
| @@ -91,3 +69,14 @@ asmlinkage void *sys_dma_memcpy(void *dest, const void *src, size_t len) | |||
| 91 | { | 69 | { |
| 92 | return safe_dma_memcpy(dest, src, len); | 70 | return safe_dma_memcpy(dest, src, len); |
| 93 | } | 71 | } |
| 72 | |||
| 73 | #if defined(CONFIG_FB) || defined(CONFIG_FB_MODULE) | ||
| 74 | #include <linux/fb.h> | ||
| 75 | unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, | ||
| 76 | unsigned long len, unsigned long pgoff, unsigned long flags) | ||
| 77 | { | ||
| 78 | struct fb_info *info = filp->private_data; | ||
| 79 | return (unsigned long)info->screen_base; | ||
| 80 | } | ||
| 81 | EXPORT_SYMBOL(get_fb_unmapped_area); | ||
| 82 | #endif | ||
diff --git a/arch/blackfin/kernel/time-ts.c b/arch/blackfin/kernel/time-ts.c index f9715764383e..359cfb1815ca 100644 --- a/arch/blackfin/kernel/time-ts.c +++ b/arch/blackfin/kernel/time-ts.c | |||
| @@ -1,13 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/kernel/time-ts.c | ||
| 3 | * | ||
| 4 | * Based on arm clockevents implementation and old bfin time tick. | 2 | * Based on arm clockevents implementation and old bfin time tick. |
| 5 | * | 3 | * |
| 6 | * Copyright(C) 2008, GeoTechnologies, Vitja Makarov | 4 | * Copyright 2008-2009 Analog Devics Inc. |
| 5 | * 2008 GeoTechnologies | ||
| 6 | * Vitja Makarov | ||
| 7 | * | 7 | * |
| 8 | * This code is licenced under the GPL version 2. For details see | 8 | * Licensed under the GPL-2 |
| 9 | * kernel-base/COPYING. | ||
| 10 | */ | 9 | */ |
| 10 | |||
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/profile.h> | 12 | #include <linux/profile.h> |
| 13 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
diff --git a/arch/blackfin/kernel/time.c b/arch/blackfin/kernel/time.c index adb54aa7d7c8..e5069fe6861e 100644 --- a/arch/blackfin/kernel/time.c +++ b/arch/blackfin/kernel/time.c | |||
| @@ -81,11 +81,11 @@ time_sched_init(irqreturn_t(*timer_routine) (int, void *)) | |||
| 81 | #endif | 81 | #endif |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET | ||
| 84 | /* | 85 | /* |
| 85 | * Should return useconds since last timer tick | 86 | * Should return useconds since last timer tick |
| 86 | */ | 87 | */ |
| 87 | #ifndef CONFIG_GENERIC_TIME | 88 | u32 arch_gettimeoffset(void) |
| 88 | static unsigned long gettimeoffset(void) | ||
| 89 | { | 89 | { |
| 90 | unsigned long offset; | 90 | unsigned long offset; |
| 91 | unsigned long clocks_per_jiffy; | 91 | unsigned long clocks_per_jiffy; |
| @@ -184,65 +184,6 @@ void __init time_init(void) | |||
| 184 | time_sched_init(timer_interrupt); | 184 | time_sched_init(timer_interrupt); |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | #ifndef CONFIG_GENERIC_TIME | ||
| 188 | void do_gettimeofday(struct timeval *tv) | ||
| 189 | { | ||
| 190 | unsigned long flags; | ||
| 191 | unsigned long seq; | ||
| 192 | unsigned long usec, sec; | ||
| 193 | |||
| 194 | do { | ||
| 195 | seq = read_seqbegin_irqsave(&xtime_lock, flags); | ||
| 196 | usec = gettimeoffset(); | ||
| 197 | sec = xtime.tv_sec; | ||
| 198 | usec += (xtime.tv_nsec / NSEC_PER_USEC); | ||
| 199 | } | ||
| 200 | while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); | ||
| 201 | |||
| 202 | while (usec >= USEC_PER_SEC) { | ||
| 203 | usec -= USEC_PER_SEC; | ||
| 204 | sec++; | ||
| 205 | } | ||
| 206 | |||
| 207 | tv->tv_sec = sec; | ||
| 208 | tv->tv_usec = usec; | ||
| 209 | } | ||
| 210 | EXPORT_SYMBOL(do_gettimeofday); | ||
| 211 | |||
| 212 | int do_settimeofday(struct timespec *tv) | ||
| 213 | { | ||
| 214 | time_t wtm_sec, sec = tv->tv_sec; | ||
| 215 | long wtm_nsec, nsec = tv->tv_nsec; | ||
| 216 | |||
| 217 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | ||
| 218 | return -EINVAL; | ||
| 219 | |||
| 220 | write_seqlock_irq(&xtime_lock); | ||
| 221 | /* | ||
| 222 | * This is revolting. We need to set the xtime.tv_usec | ||
| 223 | * correctly. However, the value in this location is | ||
| 224 | * is value at the last tick. | ||
| 225 | * Discover what correction gettimeofday | ||
| 226 | * would have done, and then undo it! | ||
| 227 | */ | ||
| 228 | nsec -= (gettimeoffset() * NSEC_PER_USEC); | ||
| 229 | |||
| 230 | wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); | ||
| 231 | wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); | ||
| 232 | |||
| 233 | set_normalized_timespec(&xtime, sec, nsec); | ||
| 234 | set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec); | ||
| 235 | |||
| 236 | ntp_clear(); | ||
| 237 | |||
| 238 | write_sequnlock_irq(&xtime_lock); | ||
| 239 | clock_was_set(); | ||
| 240 | |||
| 241 | return 0; | ||
| 242 | } | ||
| 243 | EXPORT_SYMBOL(do_settimeofday); | ||
| 244 | #endif /* !CONFIG_GENERIC_TIME */ | ||
| 245 | |||
| 246 | /* | 187 | /* |
| 247 | * Scheduler clock - returns current time in nanosec units. | 188 | * Scheduler clock - returns current time in nanosec units. |
| 248 | */ | 189 | */ |
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 56464cb8edf3..6b7325d634af 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/traps.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: Hamish Macdonald | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: uses S/W interrupt 15 for the system calls | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/bug.h> | 7 | #include <linux/bug.h> |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index ffd90fbbc8f9..10e12539000e 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/vmlinux.lds.S | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: none - original work | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: Tue Sep 21 2004 | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: Master linker script for blackfin architecture | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #define VMLINUX_SYMBOL(_sym_) _##_sym_ | 7 | #define VMLINUX_SYMBOL(_sym_) _##_sym_ |
diff --git a/arch/blackfin/lib/ashldi3.c b/arch/blackfin/lib/ashldi3.c index a8c279e9b192..ab69d8768afc 100644 --- a/arch/blackfin/lib/ashldi3.c +++ b/arch/blackfin/lib/ashldi3.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/ashldi3.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include "gcclib.h" | 7 | #include "gcclib.h" |
diff --git a/arch/blackfin/lib/ashrdi3.c b/arch/blackfin/lib/ashrdi3.c index a0d3419329ca..b5b351e82e10 100644 --- a/arch/blackfin/lib/ashrdi3.c +++ b/arch/blackfin/lib/ashrdi3.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/ashrdi3.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include "gcclib.h" | 7 | #include "gcclib.h" |
diff --git a/arch/blackfin/lib/checksum.c b/arch/blackfin/lib/checksum.c index cd605e7d8518..c62969dc1bbb 100644 --- a/arch/blackfin/lib/checksum.c +++ b/arch/blackfin/lib/checksum.c | |||
| @@ -1,32 +1,12 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/checksum.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: none - original work | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: An implementation of the TCP/IP protocol suite for the LINUX | ||
| 8 | * operating system. INET is implemented using the BSD Socket | ||
| 9 | * interface as the means of communication with the user level. | ||
| 10 | * | 5 | * |
| 11 | * Modified: | 6 | * An implementation of the TCP/IP protocol suite for the LINUX operating |
| 12 | * Copyright 2004-2006 Analog Devices Inc. | 7 | * system. INET is implemented using the BSD Socket interface as the |
| 8 | * means of communication with the user level. | ||
| 13 | * | 9 | * |
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2 of the License, or | ||
| 19 | * (at your option) any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; if not, see the file COPYING, or write | ||
| 28 | * to the Free Software Foundation, Inc., | ||
| 29 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 30 | */ | 10 | */ |
| 31 | 11 | ||
| 32 | #include <linux/module.h> | 12 | #include <linux/module.h> |
diff --git a/arch/blackfin/lib/divsi3.S b/arch/blackfin/lib/divsi3.S index 2ac59c70dd94..f89c5a49c47b 100644 --- a/arch/blackfin/lib/divsi3.S +++ b/arch/blackfin/lib/divsi3.S | |||
| @@ -1,10 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/divsi3.S | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: 16 / 32 bit signed division. | 5 | * |
| 6 | * 16 / 32 bit signed division. | ||
| 8 | * Special cases : | 7 | * Special cases : |
| 9 | * 1) If(numerator == 0) | 8 | * 1) If(numerator == 0) |
| 10 | * return 0 | 9 | * return 0 |
| @@ -22,25 +21,6 @@ | |||
| 22 | * R0 - Quotient (o) | 21 | * R0 - Quotient (o) |
| 23 | * Registers Used : R2-R7,P0-P2 | 22 | * Registers Used : R2-R7,P0-P2 |
| 24 | * | 23 | * |
| 25 | * Modified: | ||
| 26 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 27 | * | ||
| 28 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 29 | * | ||
| 30 | * This program is free software; you can redistribute it and/or modify | ||
| 31 | * it under the terms of the GNU General Public License as published by | ||
| 32 | * the Free Software Foundation; either version 2 of the License, or | ||
| 33 | * (at your option) any later version. | ||
| 34 | * | ||
| 35 | * This program is distributed in the hope that it will be useful, | ||
| 36 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 37 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 38 | * GNU General Public License for more details. | ||
| 39 | * | ||
| 40 | * You should have received a copy of the GNU General Public License | ||
| 41 | * along with this program; if not, see the file COPYING, or write | ||
| 42 | * to the Free Software Foundation, Inc., | ||
| 43 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 44 | */ | 24 | */ |
| 45 | 25 | ||
| 46 | .global ___divsi3; | 26 | .global ___divsi3; |
diff --git a/arch/blackfin/lib/gcclib.h b/arch/blackfin/lib/gcclib.h index 9ccd39a135ee..724f07f14f8d 100644 --- a/arch/blackfin/lib/gcclib.h +++ b/arch/blackfin/lib/gcclib.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/gcclib.h | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #define BITS_PER_UNIT 8 | 7 | #define BITS_PER_UNIT 8 |
diff --git a/arch/blackfin/lib/lshrdi3.c b/arch/blackfin/lib/lshrdi3.c index e57bf6fbdf3f..53f1741047e5 100644 --- a/arch/blackfin/lib/lshrdi3.c +++ b/arch/blackfin/lib/lshrdi3.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/lshrdi3.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include "gcclib.h" | 7 | #include "gcclib.h" |
diff --git a/arch/blackfin/lib/memchr.S b/arch/blackfin/lib/memchr.S index 5da428134d32..542e40f8775f 100644 --- a/arch/blackfin/lib/memchr.S +++ b/arch/blackfin/lib/memchr.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/memchr.S | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/memcmp.S b/arch/blackfin/lib/memcmp.S index 219fa2877c62..ce5b9f1a8267 100644 --- a/arch/blackfin/lib/memcmp.S +++ b/arch/blackfin/lib/memcmp.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/memcmp.S | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/memcpy.S b/arch/blackfin/lib/memcpy.S index e654a18a0754..c31bf22aab19 100644 --- a/arch/blackfin/lib/memcpy.S +++ b/arch/blackfin/lib/memcpy.S | |||
| @@ -1,36 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/memcpy.S | 2 | * internal version of memcpy(), issued by the compiler to copy blocks of |
| 3 | * Based on: | 3 | * data around. This is really memmove() - it has to be able to deal with |
| 4 | * Author: | 4 | * possible overlaps, because that ambiguity is when the compiler gives up |
| 5 | * and calls a function. We have our own, internal version so that we get | ||
| 6 | * something we trust, even if the user has redefined the normal symbol. | ||
| 5 | * | 7 | * |
| 6 | * Created: | 8 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: internal version of memcpy(), issued by the compiler | ||
| 8 | * to copy blocks of data around. | ||
| 9 | * This is really memmove() - it has to be able to deal with | ||
| 10 | * possible overlaps, because that ambiguity is when the compiler | ||
| 11 | * gives up and calls a function. We have our own, internal version | ||
| 12 | * so that we get something we trust, even if the user has redefined | ||
| 13 | * the normal symbol. | ||
| 14 | * | 9 | * |
| 15 | * Modified: | 10 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 16 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 17 | * | ||
| 18 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 19 | * | ||
| 20 | * This program is free software; you can redistribute it and/or modify | ||
| 21 | * it under the terms of the GNU General Public License as published by | ||
| 22 | * the Free Software Foundation; either version 2 of the License, or | ||
| 23 | * (at your option) any later version. | ||
| 24 | * | ||
| 25 | * This program is distributed in the hope that it will be useful, | ||
| 26 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 28 | * GNU General Public License for more details. | ||
| 29 | * | ||
| 30 | * You should have received a copy of the GNU General Public License | ||
| 31 | * along with this program; if not, see the file COPYING, or write | ||
| 32 | * to the Free Software Foundation, Inc., | ||
| 33 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 34 | */ | 11 | */ |
| 35 | 12 | ||
| 36 | #include <linux/linkage.h> | 13 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/memmove.S b/arch/blackfin/lib/memmove.S index 33f8653145b7..80c240acac60 100644 --- a/arch/blackfin/lib/memmove.S +++ b/arch/blackfin/lib/memmove.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/memmove.S | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/memset.S b/arch/blackfin/lib/memset.S index 8159136a29ea..c30d99b10969 100644 --- a/arch/blackfin/lib/memset.S +++ b/arch/blackfin/lib/memset.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/memset.S | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/modsi3.S b/arch/blackfin/lib/modsi3.S index ca1dd3973b39..8b0c7d4052af 100644 --- a/arch/blackfin/lib/modsi3.S +++ b/arch/blackfin/lib/modsi3.S | |||
| @@ -1,36 +1,12 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/modsi3.S | 2 | * This program computes 32 bit signed remainder. It calls div32 function |
| 3 | * Based on: | 3 | * for quotient estimation. |
| 4 | * Author: | 4 | * Registers in: R0, R1 = Numerator/ Denominator |
| 5 | * Registers out: R0 = Remainder | ||
| 5 | * | 6 | * |
| 6 | * Created: | 7 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: This program computes 32 bit signed remainder. It calls div32 function | ||
| 8 | * for quotient estimation. | ||
| 9 | * | 8 | * |
| 10 | * Registers used : | 9 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 11 | * Numerator/ Denominator in R0, R1 | ||
| 12 | * R0 - returns remainder. | ||
| 13 | * R2-R7 | ||
| 14 | * | ||
| 15 | * Modified: | ||
| 16 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 17 | * | ||
| 18 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 19 | * | ||
| 20 | * This program is free software; you can redistribute it and/or modify | ||
| 21 | * it under the terms of the GNU General Public License as published by | ||
| 22 | * the Free Software Foundation; either version 2 of the License, or | ||
| 23 | * (at your option) any later version. | ||
| 24 | * | ||
| 25 | * This program is distributed in the hope that it will be useful, | ||
| 26 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 28 | * GNU General Public License for more details. | ||
| 29 | * | ||
| 30 | * You should have received a copy of the GNU General Public License | ||
| 31 | * along with this program; if not, see the file COPYING, or write | ||
| 32 | * to the Free Software Foundation, Inc., | ||
| 33 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 34 | */ | 10 | */ |
| 35 | 11 | ||
| 36 | .global ___modsi3; | 12 | .global ___modsi3; |
diff --git a/arch/blackfin/lib/muldi3.S b/arch/blackfin/lib/muldi3.S index abde120ee230..953a38a1d1d1 100644 --- a/arch/blackfin/lib/muldi3.S +++ b/arch/blackfin/lib/muldi3.S | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) | ||
| 5 | */ | ||
| 6 | |||
| 1 | .align 2 | 7 | .align 2 |
| 2 | .global ___muldi3; | 8 | .global ___muldi3; |
| 3 | .type ___muldi3, STT_FUNC; | 9 | .type ___muldi3, STT_FUNC; |
diff --git a/arch/blackfin/lib/outs.S b/arch/blackfin/lib/outs.S index 4685b7aa0080..250f4d4b9436 100644 --- a/arch/blackfin/lib/outs.S +++ b/arch/blackfin/lib/outs.S | |||
| @@ -1,30 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/outs.S | 2 | * Implementation of outs{bwl} for BlackFin processors using zero overhead loops. |
| 3 | * Based on: | ||
| 4 | * Author: Bas Vermeulen <bas@buyways.nl> | ||
| 5 | * | 3 | * |
| 6 | * Created: Tue Mar 22 15:27:24 CEST 2005 | 4 | * Copyright 2005-2009 Analog Devices Inc. |
| 7 | * Description: Implementation of outs{bwl} for BlackFin processors using zero overhead loops. | 5 | * 2005 BuyWays BV |
| 6 | * Bas Vermeulen <bas@buyways.nl> | ||
| 8 | * | 7 | * |
| 9 | * Modified: Copyright (C) 2005 Bas Vermeulen, BuyWays BV <bas@buyways.nl> | 8 | * Licensed under the GPL-2. |
| 10 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 9 | */ |
| 29 | 10 | ||
| 30 | #include <linux/linkage.h> | 11 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/smulsi3_highpart.S b/arch/blackfin/lib/smulsi3_highpart.S index e383cd3eca5d..99ee8c5de38b 100644 --- a/arch/blackfin/lib/smulsi3_highpart.S +++ b/arch/blackfin/lib/smulsi3_highpart.S | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) | ||
| 5 | */ | ||
| 6 | |||
| 1 | .align 2 | 7 | .align 2 |
| 2 | .global ___smulsi3_highpart; | 8 | .global ___smulsi3_highpart; |
| 3 | .type ___smulsi3_highpart, STT_FUNC; | 9 | .type ___smulsi3_highpart, STT_FUNC; |
diff --git a/arch/blackfin/lib/udivsi3.S b/arch/blackfin/lib/udivsi3.S index 58fd96d74766..97e904315ec6 100644 --- a/arch/blackfin/lib/udivsi3.S +++ b/arch/blackfin/lib/udivsi3.S | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/udivsi3.S | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/linkage.h> | 7 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/lib/umodsi3.S b/arch/blackfin/lib/umodsi3.S index 4f2b76ee7626..168eba7c64c8 100644 --- a/arch/blackfin/lib/umodsi3.S +++ b/arch/blackfin/lib/umodsi3.S | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/lib/umodsi3.S | 2 | * libgcc1 routines for Blackfin 5xx |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: libgcc1 routines for Blackfin 5xx | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifdef CONFIG_ARITHMETIC_OPS_L1 | 9 | #ifdef CONFIG_ARITHMETIC_OPS_L1 |
diff --git a/arch/blackfin/lib/umulsi3_highpart.S b/arch/blackfin/lib/umulsi3_highpart.S index 67b799351e3e..051824a6ed00 100644 --- a/arch/blackfin/lib/umulsi3_highpart.S +++ b/arch/blackfin/lib/umulsi3_highpart.S | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) | ||
| 5 | */ | ||
| 6 | |||
| 1 | .align 2 | 7 | .align 2 |
| 2 | .global ___umulsi3_highpart; | 8 | .global ___umulsi3_highpart; |
| 3 | .type ___umulsi3_highpart, STT_FUNC; | 9 | .type ___umulsi3_highpart, STT_FUNC; |
diff --git a/arch/blackfin/mach-bf518/boards/ezbrd.c b/arch/blackfin/mach-bf518/boards/ezbrd.c index 03e4a9941f01..01975c017116 100644 --- a/arch/blackfin/mach-bf518/boards/ezbrd.c +++ b/arch/blackfin/mach-bf518/boards/ezbrd.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf518/boards/ezbrd.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf527/boards/ezbrd.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Bryan Wu <cooloney@kernel.org> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -571,19 +549,6 @@ static struct platform_device bf51x_sdh_device = { | |||
| 571 | }; | 549 | }; |
| 572 | #endif | 550 | #endif |
| 573 | 551 | ||
| 574 | static struct resource bfin_gpios_resources = { | ||
| 575 | .start = 0, | ||
| 576 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 577 | .flags = IORESOURCE_IRQ, | ||
| 578 | }; | ||
| 579 | |||
| 580 | static struct platform_device bfin_gpios_device = { | ||
| 581 | .name = "simple-gpio", | ||
| 582 | .id = -1, | ||
| 583 | .num_resources = 1, | ||
| 584 | .resource = &bfin_gpios_resources, | ||
| 585 | }; | ||
| 586 | |||
| 587 | static const unsigned int cclk_vlev_datasheet[] = | 552 | static const unsigned int cclk_vlev_datasheet[] = |
| 588 | { | 553 | { |
| 589 | VRPAIR(VLEV_100, 400000000), | 554 | VRPAIR(VLEV_100, 400000000), |
| @@ -660,8 +625,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 660 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 625 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 661 | &ezbrd_flash_device, | 626 | &ezbrd_flash_device, |
| 662 | #endif | 627 | #endif |
| 663 | |||
| 664 | &bfin_gpios_device, | ||
| 665 | }; | 628 | }; |
| 666 | 629 | ||
| 667 | static int __init ezbrd_init(void) | 630 | static int __init ezbrd_init(void) |
diff --git a/arch/blackfin/mach-bf518/dma.c b/arch/blackfin/mach-bf518/dma.c index 698e88ca5104..78b43605a0b5 100644 --- a/arch/blackfin/mach-bf518/dma.c +++ b/arch/blackfin/mach-bf518/dma.c | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf518/dma.c | 2 | * the simple DMA Implementation for Blackfin |
| 3 | * Based on: | ||
| 4 | * Author: Bryan Wu <cooloney@kernel.org> | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2008 Analog Devices Inc. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 8 | |||
| 29 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-bf518/include/mach/bf518.h b/arch/blackfin/mach-bf518/include/mach/bf518.h index 78da1a07ee73..856b330ecf0b 100644 --- a/arch/blackfin/mach-bf518/include/mach/bf518.h +++ b/arch/blackfin/mach-bf518/include/mach/bf518.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/bf518.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * Based on: include/asm-blackfin/mach-bf527/bf527.h | ||
| 4 | * Author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF518 | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #ifndef __MACH_BF518_H__ | 7 | #ifndef __MACH_BF518_H__ |
diff --git a/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h index dbade93395eb..970d310021e7 100644 --- a/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf518/bfin_serial_5xx.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * blackfin serial driver head file | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf518/include/mach/blackfin.h b/arch/blackfin/mach-bf518/include/mach/blackfin.h index 83421d393148..6cfb246aebec 100644 --- a/arch/blackfin/mach-bf518/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf518/include/mach/blackfin.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/blackfin.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf518/include/mach/cdefBF512.h b/arch/blackfin/mach-bf518/include/mach/cdefBF512.h index 820c13c4daaa..493020d0a65a 100644 --- a/arch/blackfin/mach-bf518/include/mach/cdefBF512.h +++ b/arch/blackfin/mach-bf518/include/mach/cdefBF512.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/cdefbf512.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF512_H | 7 | #ifndef _CDEF_BF512_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/cdefBF514.h b/arch/blackfin/mach-bf518/include/mach/cdefBF514.h index dfe492dfe54e..e1d99911025d 100644 --- a/arch/blackfin/mach-bf518/include/mach/cdefBF514.h +++ b/arch/blackfin/mach-bf518/include/mach/cdefBF514.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/cdefbf514.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF514_H | 7 | #ifndef _CDEF_BF514_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/cdefBF516.h b/arch/blackfin/mach-bf518/include/mach/cdefBF516.h index 14df43d4677a..6b364eda4947 100644 --- a/arch/blackfin/mach-bf518/include/mach/cdefBF516.h +++ b/arch/blackfin/mach-bf518/include/mach/cdefBF516.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/cdefbf516.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF516_H | 7 | #ifndef _CDEF_BF516_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/cdefBF518.h b/arch/blackfin/mach-bf518/include/mach/cdefBF518.h index bafb370cfb3c..929b90650bd4 100644 --- a/arch/blackfin/mach-bf518/include/mach/cdefBF518.h +++ b/arch/blackfin/mach-bf518/include/mach/cdefBF518.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/cdefbf518.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF518_H | 7 | #ifndef _CDEF_BF518_H |
| @@ -211,6 +186,47 @@ | |||
| 211 | #define bfin_read_EMAC_TXC_ABORT() bfin_read32(EMAC_TXC_ABORT) | 186 | #define bfin_read_EMAC_TXC_ABORT() bfin_read32(EMAC_TXC_ABORT) |
| 212 | #define bfin_write_EMAC_TXC_ABORT(val) bfin_write32(EMAC_TXC_ABORT, val) | 187 | #define bfin_write_EMAC_TXC_ABORT(val) bfin_write32(EMAC_TXC_ABORT, val) |
| 213 | 188 | ||
| 189 | #define bfin_read_EMAC_PTP_CTL() bfin_read16(EMAC_PTP_CTL) | ||
| 190 | #define bfin_write_EMAC_PTP_CTL(val) bfin_write16(EMAC_PTP_CTL, val) | ||
| 191 | #define bfin_read_EMAC_PTP_IE() bfin_read16(EMAC_PTP_IE) | ||
| 192 | #define bfin_write_EMAC_PTP_IE(val) bfin_write16(EMAC_PTP_IE, val) | ||
| 193 | #define bfin_read_EMAC_PTP_ISTAT() bfin_read16(EMAC_PTP_ISTAT) | ||
| 194 | #define bfin_write_EMAC_PTP_ISTAT(val) bfin_write16(EMAC_PTP_ISTAT, val) | ||
| 195 | #define bfin_read_EMAC_PTP_FOFF() bfin_read32(EMAC_PTP_FOFF) | ||
| 196 | #define bfin_write_EMAC_PTP_FOFF(val) bfin_write32(EMAC_PTP_FOFF, val) | ||
| 197 | #define bfin_read_EMAC_PTP_FV1() bfin_read32(EMAC_PTP_FV1) | ||
| 198 | #define bfin_write_EMAC_PTP_FV1(val) bfin_write32(EMAC_PTP_FV1, val) | ||
| 199 | #define bfin_read_EMAC_PTP_FV2() bfin_read32(EMAC_PTP_FV2) | ||
| 200 | #define bfin_write_EMAC_PTP_FV2(val) bfin_write32(EMAC_PTP_FV2, val) | ||
| 201 | #define bfin_read_EMAC_PTP_FV3() bfin_read32(EMAC_PTP_FV3) | ||
| 202 | #define bfin_write_EMAC_PTP_FV3(val) bfin_write32(EMAC_PTP_FV3, val) | ||
| 203 | #define bfin_read_EMAC_PTP_ADDEND() bfin_read32(EMAC_PTP_ADDEND) | ||
| 204 | #define bfin_write_EMAC_PTP_ADDEND(val) bfin_write32(EMAC_PTP_ADDEND, val) | ||
| 205 | #define bfin_read_EMAC_PTP_ACCR() bfin_read32(EMAC_PTP_ACCR) | ||
| 206 | #define bfin_write_EMAC_PTP_ACCR(val) bfin_write32(EMAC_PTP_ACCR, val) | ||
| 207 | #define bfin_read_EMAC_PTP_OFFSET() bfin_read32(EMAC_PTP_OFFSET) | ||
| 208 | #define bfin_write_EMAC_PTP_OFFSET(val) bfin_write32(EMAC_PTP_OFFSET, val) | ||
| 209 | #define bfin_read_EMAC_PTP_TIMELO() bfin_read32(EMAC_PTP_TIMELO) | ||
| 210 | #define bfin_write_EMAC_PTP_TIMELO(val) bfin_write32(EMAC_PTP_TIMELO, val) | ||
| 211 | #define bfin_read_EMAC_PTP_TIMEHI() bfin_read32(EMAC_PTP_TIMEHI) | ||
| 212 | #define bfin_write_EMAC_PTP_TIMEHI(val) bfin_write32(EMAC_PTP_TIMEHI, val) | ||
| 213 | #define bfin_read_EMAC_PTP_RXSNAPLO() bfin_read32(EMAC_PTP_RXSNAPLO) | ||
| 214 | #define bfin_read_EMAC_PTP_RXSNAPHI() bfin_read32(EMAC_PTP_RXSNAPHI) | ||
| 215 | #define bfin_read_EMAC_PTP_TXSNAPLO() bfin_read32(EMAC_PTP_TXSNAPLO) | ||
| 216 | #define bfin_read_EMAC_PTP_TXSNAPHI() bfin_read32(EMAC_PTP_TXSNAPHI) | ||
| 217 | #define bfin_read_EMAC_PTP_ALARMLO() bfin_read32(EMAC_PTP_ALARMLO) | ||
| 218 | #define bfin_write_EMAC_PTP_ALARMLO(val) bfin_write32(EMAC_PTP_ALARMLO, val) | ||
| 219 | #define bfin_read_EMAC_PTP_ALARMHI() bfin_read32(EMAC_PTP_ALARMHI) | ||
| 220 | #define bfin_write_EMAC_PTP_ALARMHI(val) bfin_write32(EMAC_PTP_ALARMHI, val) | ||
| 221 | #define bfin_read_EMAC_PTP_ID_OFF() bfin_read16(EMAC_PTP_ID_OFF) | ||
| 222 | #define bfin_write_EMAC_PTP_ID_OFF(val) bfin_write16(EMAC_PTP_ID_OFF, val) | ||
| 223 | #define bfin_read_EMAC_PTP_ID_SNAP() bfin_read32(EMAC_PTP_ID_SNAP) | ||
| 224 | #define bfin_write_EMAC_PTP_ID_SNAP(val) bfin_write32(EMAC_PTP_ID_SNAP, val) | ||
| 225 | #define bfin_read_EMAC_PTP_PPS_STARTHI() bfin_read32(EMAC_PTP_PPS_STARTHI) | ||
| 226 | #define bfin_write_EMAC_PTP_PPS_STARTHI(val) bfin_write32(EMAC_PTP_PPS_STARTHI, val) | ||
| 227 | #define bfin_read_EMAC_PTP_PPS_PERIOD() bfin_read32(EMAC_PTP_PPS_PERIOD) | ||
| 228 | #define bfin_write_EMAC_PTP_PPS_PERIOD(val) bfin_write32(EMAC_PTP_PPS_PERIOD, val) | ||
| 229 | |||
| 214 | /* Removable Storage Interface Registers */ | 230 | /* Removable Storage Interface Registers */ |
| 215 | 231 | ||
| 216 | #define bfin_read_RSI_PWR_CTL() bfin_read16(RSI_PWR_CONTROL) | 232 | #define bfin_read_RSI_PWR_CTL() bfin_read16(RSI_PWR_CONTROL) |
diff --git a/arch/blackfin/mach-bf518/include/mach/cdefBF51x_base.h b/arch/blackfin/mach-bf518/include/mach/cdefBF51x_base.h index ee3d4733369c..1d970df7aee9 100644 --- a/arch/blackfin/mach-bf518/include/mach/cdefBF51x_base.h +++ b/arch/blackfin/mach-bf518/include/mach/cdefBF51x_base.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/cdefBF51x_base.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF52X_H | 7 | #ifndef _CDEF_BF52X_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/defBF512.h b/arch/blackfin/mach-bf518/include/mach/defBF512.h index a96ca90154dd..9b505bb0cb2d 100644 --- a/arch/blackfin/mach-bf518/include/mach/defBF512.h +++ b/arch/blackfin/mach-bf518/include/mach/defBF512.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/defBF512.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF512_H | 7 | #ifndef _DEF_BF512_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/defBF514.h b/arch/blackfin/mach-bf518/include/mach/defBF514.h index 56ee5a7c2007..b5adca23a788 100644 --- a/arch/blackfin/mach-bf518/include/mach/defBF514.h +++ b/arch/blackfin/mach-bf518/include/mach/defBF514.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/defBF514.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF514_H | 7 | #ifndef _DEF_BF514_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/defBF516.h b/arch/blackfin/mach-bf518/include/mach/defBF516.h index dfc93843517d..7eb18774d727 100644 --- a/arch/blackfin/mach-bf518/include/mach/defBF516.h +++ b/arch/blackfin/mach-bf518/include/mach/defBF516.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/defBF516.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF516_H | 7 | #ifndef _DEF_BF516_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/defBF518.h b/arch/blackfin/mach-bf518/include/mach/defBF518.h index 6e982abf4ede..794cf06eb5ba 100644 --- a/arch/blackfin/mach-bf518/include/mach/defBF518.h +++ b/arch/blackfin/mach-bf518/include/mach/defBF518.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/defBF518.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF518_H | 7 | #ifndef _DEF_BF518_H |
| @@ -648,4 +624,32 @@ | |||
| 648 | 624 | ||
| 649 | #define RWR 0x1 /* Read Wait Request */ | 625 | #define RWR 0x1 /* Read Wait Request */ |
| 650 | 626 | ||
| 627 | /* Bit masks for EMAC_PTP_CTL */ | ||
| 628 | |||
| 629 | #define PTP_EN 0x1 /* Enable the PTP_TSYNC module */ | ||
| 630 | #define TL 0x2 /* Timestamp lock control */ | ||
| 631 | #define ASEN 0x10 /* Auxiliary snapshot control */ | ||
| 632 | #define PPSEN 0x80 /* Pulse-per-second (PPS) control */ | ||
| 633 | #define CKOEN 0x2000 /* Clock output control */ | ||
| 634 | |||
| 635 | /* Bit masks for EMAC_PTP_IE */ | ||
| 636 | |||
| 637 | #define ALIE 0x1 /* Alarm interrupt enable */ | ||
| 638 | #define RXEIE 0x2 /* Receive event interrupt enable */ | ||
| 639 | #define RXGIE 0x4 /* Receive general interrupt enable */ | ||
| 640 | #define TXIE 0x8 /* Transmit interrupt enable */ | ||
| 641 | #define RXOVE 0x10 /* Receive overrun error interrupt enable */ | ||
| 642 | #define TXOVE 0x20 /* Transmit overrun error interrupt enable */ | ||
| 643 | #define ASIE 0x40 /* Auxiliary snapshot interrupt enable */ | ||
| 644 | |||
| 645 | /* Bit masks for EMAC_PTP_ISTAT */ | ||
| 646 | |||
| 647 | #define ALS 0x1 /* Alarm status */ | ||
| 648 | #define RXEL 0x2 /* Receive event interrupt status */ | ||
| 649 | #define RXGL 0x4 /* Receive general interrupt status */ | ||
| 650 | #define TXTL 0x8 /* Transmit snapshot status */ | ||
| 651 | #define RXOV 0x10 /* Receive snapshot overrun status */ | ||
| 652 | #define TXOV 0x20 /* Transmit snapshot overrun status */ | ||
| 653 | #define ASL 0x40 /* Auxiliary snapshot interrupt status */ | ||
| 654 | |||
| 651 | #endif /* _DEF_BF518_H */ | 655 | #endif /* _DEF_BF518_H */ |
diff --git a/arch/blackfin/mach-bf518/include/mach/defBF51x_base.h b/arch/blackfin/mach-bf518/include/mach/defBF51x_base.h index 1bec8d1c2a73..e06f4112c695 100644 --- a/arch/blackfin/mach-bf518/include/mach/defBF51x_base.h +++ b/arch/blackfin/mach-bf518/include/mach/defBF51x_base.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf518/defBF51x_base.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF51X_H | 7 | #ifndef _DEF_BF51X_H |
diff --git a/arch/blackfin/mach-bf518/include/mach/gpio.h b/arch/blackfin/mach-bf518/include/mach/gpio.h index 9757683c3948..bbab2d76499c 100644 --- a/arch/blackfin/mach-bf518/include/mach/gpio.h +++ b/arch/blackfin/mach-bf518/include/mach/gpio.h | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf518/include/mach/gpio.h | ||
| 3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 4 | * | ||
| 5 | * Copyright (C) 2008 Analog Devices Inc. | 2 | * Copyright (C) 2008 Analog Devices Inc. |
| 6 | * Licensed under the GPL-2 or later. | 3 | * Licensed under the GPL-2 or later. |
| 7 | */ | 4 | */ |
diff --git a/arch/blackfin/mach-bf518/include/mach/irq.h b/arch/blackfin/mach-bf518/include/mach/irq.h index 3ff0f093313d..14e52ec7afa5 100644 --- a/arch/blackfin/mach-bf518/include/mach/irq.h +++ b/arch/blackfin/mach-bf518/include/mach/irq.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf518/irq.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * based on: include/asm-blackfin/mach-bf527/irq.h | ||
| 4 | * author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * system mmr register map | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _BF518_IRQ_H_ | 7 | #ifndef _BF518_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf518/include/mach/portmux.h b/arch/blackfin/mach-bf518/include/mach/portmux.h index a0fc77fd3315..e352910f7f99 100644 --- a/arch/blackfin/mach-bf518/include/mach/portmux.h +++ b/arch/blackfin/mach-bf518/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf518/ints-priority.c b/arch/blackfin/mach-bf518/ints-priority.c index 3151fd5501ca..bb05bef34ec0 100644 --- a/arch/blackfin/mach-bf518/ints-priority.c +++ b/arch/blackfin/mach-bf518/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf518/ints-priority.c | 2 | * Set up the interrupt priorities |
| 3 | * Based on: arch/blackfin/mach-bf527/ints-priority.c | ||
| 4 | * Author: Bryan Wu <cooloney@kernel.org> | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2008 Analog Devices Inc. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c index 08a3f01c9886..f1996b13a3da 100644 --- a/arch/blackfin/mach-bf527/boards/cm_bf527.c +++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c | |||
| @@ -1,31 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf527/boards/cm-bf527.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf537/boards/stamp.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 8 | */ |
| 30 | 9 | ||
| 31 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -616,12 +595,6 @@ static struct platform_device bfin_spi0_device = { | |||
| 616 | }; | 595 | }; |
| 617 | #endif /* spi master and devices */ | 596 | #endif /* spi master and devices */ |
| 618 | 597 | ||
| 619 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 620 | static struct platform_device bfin_fb_adv7393_device = { | ||
| 621 | .name = "bfin-adv7393", | ||
| 622 | }; | ||
| 623 | #endif | ||
| 624 | |||
| 625 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 598 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 626 | static struct mtd_partition cm_partitions[] = { | 599 | static struct mtd_partition cm_partitions[] = { |
| 627 | { | 600 | { |
| @@ -786,6 +759,11 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | |||
| 786 | .irq = IRQ_PF8, | 759 | .irq = IRQ_PF8, |
| 787 | }, | 760 | }, |
| 788 | #endif | 761 | #endif |
| 762 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 763 | { | ||
| 764 | I2C_BOARD_INFO("bfin-adv7393", 0x2B), | ||
| 765 | }, | ||
| 766 | #endif | ||
| 789 | }; | 767 | }; |
| 790 | 768 | ||
| 791 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | 769 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) |
| @@ -821,19 +799,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 821 | }; | 799 | }; |
| 822 | #endif | 800 | #endif |
| 823 | 801 | ||
| 824 | static struct resource bfin_gpios_resources = { | ||
| 825 | .start = 0, | ||
| 826 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 827 | .flags = IORESOURCE_IRQ, | ||
| 828 | }; | ||
| 829 | |||
| 830 | static struct platform_device bfin_gpios_device = { | ||
| 831 | .name = "simple-gpio", | ||
| 832 | .id = -1, | ||
| 833 | .num_resources = 1, | ||
| 834 | .resource = &bfin_gpios_resources, | ||
| 835 | }; | ||
| 836 | |||
| 837 | static const unsigned int cclk_vlev_datasheet[] = | 802 | static const unsigned int cclk_vlev_datasheet[] = |
| 838 | { | 803 | { |
| 839 | VRPAIR(VLEV_100, 400000000), | 804 | VRPAIR(VLEV_100, 400000000), |
| @@ -909,10 +874,6 @@ static struct platform_device *cmbf527_devices[] __initdata = { | |||
| 909 | &bfin_spi0_device, | 874 | &bfin_spi0_device, |
| 910 | #endif | 875 | #endif |
| 911 | 876 | ||
| 912 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 913 | &bfin_fb_adv7393_device, | ||
| 914 | #endif | ||
| 915 | |||
| 916 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 877 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
| 917 | &bfin_uart_device, | 878 | &bfin_uart_device, |
| 918 | #endif | 879 | #endif |
| @@ -942,8 +903,6 @@ static struct platform_device *cmbf527_devices[] __initdata = { | |||
| 942 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 903 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 943 | &cm_flash_device, | 904 | &cm_flash_device, |
| 944 | #endif | 905 | #endif |
| 945 | |||
| 946 | &bfin_gpios_device, | ||
| 947 | }; | 906 | }; |
| 948 | 907 | ||
| 949 | static int __init cm_init(void) | 908 | static int __init cm_init(void) |
diff --git a/arch/blackfin/mach-bf527/boards/ezbrd.c b/arch/blackfin/mach-bf527/boards/ezbrd.c index 68b4c804364c..cad23b15d83c 100644 --- a/arch/blackfin/mach-bf527/boards/ezbrd.c +++ b/arch/blackfin/mach-bf527/boards/ezbrd.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf527/boards/ezbrd.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf537/boards/stamp.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -611,19 +589,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 611 | }; | 589 | }; |
| 612 | #endif | 590 | #endif |
| 613 | 591 | ||
| 614 | static struct resource bfin_gpios_resources = { | ||
| 615 | .start = 0, | ||
| 616 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 617 | .flags = IORESOURCE_IRQ, | ||
| 618 | }; | ||
| 619 | |||
| 620 | static struct platform_device bfin_gpios_device = { | ||
| 621 | .name = "simple-gpio", | ||
| 622 | .id = -1, | ||
| 623 | .num_resources = 1, | ||
| 624 | .resource = &bfin_gpios_resources, | ||
| 625 | }; | ||
| 626 | |||
| 627 | static const unsigned int cclk_vlev_datasheet[] = | 592 | static const unsigned int cclk_vlev_datasheet[] = |
| 628 | { | 593 | { |
| 629 | VRPAIR(VLEV_100, 400000000), | 594 | VRPAIR(VLEV_100, 400000000), |
| @@ -732,8 +697,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 732 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 697 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 733 | &ezbrd_flash_device, | 698 | &ezbrd_flash_device, |
| 734 | #endif | 699 | #endif |
| 735 | |||
| 736 | &bfin_gpios_device, | ||
| 737 | }; | 700 | }; |
| 738 | 701 | ||
| 739 | static int __init ezbrd_init(void) | 702 | static int __init ezbrd_init(void) |
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c index 2849b09abe99..f09665f74ba0 100644 --- a/arch/blackfin/mach-bf527/boards/ezkit.c +++ b/arch/blackfin/mach-bf527/boards/ezkit.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf527/boards/ezkit.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf537/boards/stamp.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -716,12 +694,6 @@ static struct platform_device bfin_fb_device = { | |||
| 716 | }; | 694 | }; |
| 717 | #endif | 695 | #endif |
| 718 | 696 | ||
| 719 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 720 | static struct platform_device bfin_fb_adv7393_device = { | ||
| 721 | .name = "bfin-adv7393", | ||
| 722 | }; | ||
| 723 | #endif | ||
| 724 | |||
| 725 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 697 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
| 726 | static struct resource bfin_uart_resources[] = { | 698 | static struct resource bfin_uart_resources[] = { |
| 727 | #ifdef CONFIG_SERIAL_BFIN_UART0 | 699 | #ifdef CONFIG_SERIAL_BFIN_UART0 |
| @@ -837,6 +809,11 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | |||
| 837 | .irq = IRQ_PF8, | 809 | .irq = IRQ_PF8, |
| 838 | }, | 810 | }, |
| 839 | #endif | 811 | #endif |
| 812 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 813 | { | ||
| 814 | I2C_BOARD_INFO("bfin-adv7393", 0x2B), | ||
| 815 | }, | ||
| 816 | #endif | ||
| 840 | }; | 817 | }; |
| 841 | 818 | ||
| 842 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | 819 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) |
| @@ -905,19 +882,6 @@ static struct platform_device bfin_rotary_device = { | |||
| 905 | }; | 882 | }; |
| 906 | #endif | 883 | #endif |
| 907 | 884 | ||
| 908 | static struct resource bfin_gpios_resources = { | ||
| 909 | .start = 0, | ||
| 910 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 911 | .flags = IORESOURCE_IRQ, | ||
| 912 | }; | ||
| 913 | |||
| 914 | static struct platform_device bfin_gpios_device = { | ||
| 915 | .name = "simple-gpio", | ||
| 916 | .id = -1, | ||
| 917 | .num_resources = 1, | ||
| 918 | .resource = &bfin_gpios_resources, | ||
| 919 | }; | ||
| 920 | |||
| 921 | static const unsigned int cclk_vlev_datasheet[] = | 885 | static const unsigned int cclk_vlev_datasheet[] = |
| 922 | { | 886 | { |
| 923 | VRPAIR(VLEV_100, 400000000), | 887 | VRPAIR(VLEV_100, 400000000), |
| @@ -1001,10 +965,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 1001 | &bf52x_t350mcqb_device, | 965 | &bf52x_t350mcqb_device, |
| 1002 | #endif | 966 | #endif |
| 1003 | 967 | ||
| 1004 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 1005 | &bfin_fb_adv7393_device, | ||
| 1006 | #endif | ||
| 1007 | |||
| 1008 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 968 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
| 1009 | &bfin_uart_device, | 969 | &bfin_uart_device, |
| 1010 | #endif | 970 | #endif |
| @@ -1038,8 +998,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 1038 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 998 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 1039 | &ezkit_flash_device, | 999 | &ezkit_flash_device, |
| 1040 | #endif | 1000 | #endif |
| 1041 | |||
| 1042 | &bfin_gpios_device, | ||
| 1043 | }; | 1001 | }; |
| 1044 | 1002 | ||
| 1045 | static int __init ezkit_init(void) | 1003 | static int __init ezkit_init(void) |
diff --git a/arch/blackfin/mach-bf527/dma.c b/arch/blackfin/mach-bf527/dma.c index 231877578243..7bc7577d6c4f 100644 --- a/arch/blackfin/mach-bf527/dma.c +++ b/arch/blackfin/mach-bf527/dma.c | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf527/dma.c | 2 | * This file contains the simple DMA Implementation for Blackfin |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2007-2008 Analog Devices Inc. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 8 | |||
| 29 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-bf527/include/mach/bf527.h b/arch/blackfin/mach-bf527/include/mach/bf527.h index 3832aab11e9a..ff68c8897087 100644 --- a/arch/blackfin/mach-bf527/include/mach/bf527.h +++ b/arch/blackfin/mach-bf527/include/mach/bf527.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/bf527.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: include/asm-blackfin/mach-bf537/bf537.h | ||
| 4 | * Author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF527 | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #ifndef __MACH_BF527_H__ | 7 | #ifndef __MACH_BF527_H__ |
diff --git a/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h index ebd6cebc1fbc..c1d55b878b45 100644 --- a/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf527/bfin_serial_5xx.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * blackfin serial driver head file | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf527/include/mach/blackfin.h b/arch/blackfin/mach-bf527/include/mach/blackfin.h index ea9cb0fef8bc..e7d6034f268f 100644 --- a/arch/blackfin/mach-bf527/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf527/include/mach/blackfin.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/blackfin.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf527/include/mach/cdefBF522.h b/arch/blackfin/mach-bf527/include/mach/cdefBF522.h index 663c2bbdfd91..1079af8c7aef 100644 --- a/arch/blackfin/mach-bf527/include/mach/cdefBF522.h +++ b/arch/blackfin/mach-bf527/include/mach/cdefBF522.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/cdefbf522.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF522_H | 7 | #ifndef _CDEF_BF522_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/cdefBF525.h b/arch/blackfin/mach-bf527/include/mach/cdefBF525.h index 00377eb59b75..dc3119e9f663 100644 --- a/arch/blackfin/mach-bf527/include/mach/cdefBF525.h +++ b/arch/blackfin/mach-bf527/include/mach/cdefBF525.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/cdefbf525.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF525_H | 7 | #ifndef _CDEF_BF525_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/cdefBF527.h b/arch/blackfin/mach-bf527/include/mach/cdefBF527.h index fca8db708119..d6579449ee46 100644 --- a/arch/blackfin/mach-bf527/include/mach/cdefBF527.h +++ b/arch/blackfin/mach-bf527/include/mach/cdefBF527.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/cdefbf527.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF527_H | 7 | #ifndef _CDEF_BF527_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/cdefBF52x_base.h b/arch/blackfin/mach-bf527/include/mach/cdefBF52x_base.h index 1fe76d8e0403..7014dde10dd6 100644 --- a/arch/blackfin/mach-bf527/include/mach/cdefBF52x_base.h +++ b/arch/blackfin/mach-bf527/include/mach/cdefBF52x_base.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/cdefBF52x_base.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF52X_H | 7 | #ifndef _CDEF_BF52X_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/defBF522.h b/arch/blackfin/mach-bf527/include/mach/defBF522.h index 0a8cdcdf0b49..cb139a254810 100644 --- a/arch/blackfin/mach-bf527/include/mach/defBF522.h +++ b/arch/blackfin/mach-bf527/include/mach/defBF522.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/defBF522.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF522_H | 7 | #ifndef _DEF_BF522_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/defBF525.h b/arch/blackfin/mach-bf527/include/mach/defBF525.h index 5cd7576fef76..82abefc1ef6c 100644 --- a/arch/blackfin/mach-bf527/include/mach/defBF525.h +++ b/arch/blackfin/mach-bf527/include/mach/defBF525.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/defBF525.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF525_H | 7 | #ifndef _DEF_BF525_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/defBF527.h b/arch/blackfin/mach-bf527/include/mach/defBF527.h index f040f364afa3..570a125df025 100644 --- a/arch/blackfin/mach-bf527/include/mach/defBF527.h +++ b/arch/blackfin/mach-bf527/include/mach/defBF527.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/defBF527.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF527_H | 7 | #ifndef _DEF_BF527_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/defBF52x_base.h b/arch/blackfin/mach-bf527/include/mach/defBF52x_base.h index 68b55d03fedf..f821700716ee 100644 --- a/arch/blackfin/mach-bf527/include/mach/defBF52x_base.h +++ b/arch/blackfin/mach-bf527/include/mach/defBF52x_base.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf527/defBF52x_base.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF52X_H | 7 | #ifndef _DEF_BF52X_H |
diff --git a/arch/blackfin/mach-bf527/include/mach/gpio.h b/arch/blackfin/mach-bf527/include/mach/gpio.h index 06b6eebf0d49..104bff85290d 100644 --- a/arch/blackfin/mach-bf527/include/mach/gpio.h +++ b/arch/blackfin/mach-bf527/include/mach/gpio.h | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf527/include/mach/gpio.h | ||
| 3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 4 | * | ||
| 5 | * Copyright (C) 2008 Analog Devices Inc. | 2 | * Copyright (C) 2008 Analog Devices Inc. |
| 6 | * Licensed under the GPL-2 or later. | 3 | * Licensed under the GPL-2 or later. |
| 7 | */ | 4 | */ |
diff --git a/arch/blackfin/mach-bf527/include/mach/irq.h b/arch/blackfin/mach-bf527/include/mach/irq.h index 8ea660d8151f..aa6579a64a2f 100644 --- a/arch/blackfin/mach-bf527/include/mach/irq.h +++ b/arch/blackfin/mach-bf527/include/mach/irq.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf527/irq.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * based on: include/asm-blackfin/mach-bf537/irq.h | ||
| 4 | * author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * system mmr register map | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _BF527_IRQ_H_ | 7 | #ifndef _BF527_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf527/include/mach/portmux.h b/arch/blackfin/mach-bf527/include/mach/portmux.h index 72b1652be4da..d4518b6f4adf 100644 --- a/arch/blackfin/mach-bf527/include/mach/portmux.h +++ b/arch/blackfin/mach-bf527/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf527/ints-priority.c b/arch/blackfin/mach-bf527/ints-priority.c index f8c8acd73e30..44ca215bf164 100644 --- a/arch/blackfin/mach-bf527/ints-priority.c +++ b/arch/blackfin/mach-bf527/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/ints-priority.c | 2 | * Set up the interrupt priorities |
| 3 | * Based on: arch/blackfin/mach-bf533/ints-priority.c | ||
| 4 | * Author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2007-2008 Analog Devices Inc. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf533/boards/H8606.c b/arch/blackfin/mach-bf533/boards/H8606.c index 6c2b47fe4fe4..43f43a095a99 100644 --- a/arch/blackfin/mach-bf533/boards/H8606.c +++ b/arch/blackfin/mach-bf533/boards/H8606.c | |||
| @@ -1,32 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/H8606.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/stamp.c | 3 | * 2007-2008 HV Sistemas S.L. |
| 4 | * Author: Javier Herrero <jherrero@hvsistemas.es> | 4 | * Javier Herrero <jherrero@hvsistemas.es> |
| 5 | * 2005 National ICT Australia (NICTA) | ||
| 6 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 7 | * |
| 6 | * Created: 2007 | 8 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board Info File for the HV Sistemas H8606 board | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc | ||
| 12 | * Copyright 2007,2008 HV Sistemas S.L. | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2 of the License, or | ||
| 19 | * (at your option) any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; if not, see the file COPYING, or write | ||
| 28 | * to the Free Software Foundation, Inc., | ||
| 29 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 30 | */ | 9 | */ |
| 31 | 10 | ||
| 32 | #include <linux/device.h> | 11 | #include <linux/device.h> |
diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c index 8208d67e2c97..b580884848d4 100644 --- a/arch/blackfin/mach-bf533/boards/blackstamp.c +++ b/arch/blackfin/mach-bf533/boards/blackstamp.c | |||
| @@ -1,16 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/blackstamp.c | 2 | * Board Info File for the BlackStamp |
| 3 | * Based on: arch/blackfin/mach-bf533/stamp.c | ||
| 4 | * Author: Benjamin Matthews <bmat@lle.rochester.edu> | ||
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 6 | * | 3 | * |
| 7 | * Created: 2008 | ||
| 8 | * Description: Board Info File for the BlackStamp | ||
| 9 | * | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | 4 | * Copyright 2004-2008 Analog Devices Inc. |
| 12 | * | 5 | * 2008 Benjamin Matthews <bmat@lle.rochester.edu> |
| 13 | * Enter bugs at http://blackfin.uclinux.org/ | 6 | * 2005 National ICT Australia (NICTA) |
| 7 | * Aidan Williams <aidan@nicta.com.au> | ||
| 14 | * | 8 | * |
| 15 | * More info about the BlackStamp at: | 9 | * More info about the BlackStamp at: |
| 16 | * http://blackfin.uclinux.org/gf/project/blackstamp/ | 10 | * http://blackfin.uclinux.org/gf/project/blackstamp/ |
| @@ -281,19 +275,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 281 | }; | 275 | }; |
| 282 | #endif | 276 | #endif |
| 283 | 277 | ||
| 284 | static struct resource bfin_gpios_resources = { | ||
| 285 | .start = 0, | ||
| 286 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 287 | .flags = IORESOURCE_IRQ, | ||
| 288 | }; | ||
| 289 | |||
| 290 | static struct platform_device bfin_gpios_device = { | ||
| 291 | .name = "simple-gpio", | ||
| 292 | .id = -1, | ||
| 293 | .num_resources = 1, | ||
| 294 | .resource = &bfin_gpios_resources, | ||
| 295 | }; | ||
| 296 | |||
| 297 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 278 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
| 298 | #include <linux/i2c-gpio.h> | 279 | #include <linux/i2c-gpio.h> |
| 299 | 280 | ||
| @@ -384,8 +365,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 384 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 365 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
| 385 | &i2c_gpio_device, | 366 | &i2c_gpio_device, |
| 386 | #endif | 367 | #endif |
| 387 | |||
| 388 | &bfin_gpios_device, | ||
| 389 | }; | 368 | }; |
| 390 | 369 | ||
| 391 | static int __init blackstamp_init(void) | 370 | static int __init blackstamp_init(void) |
diff --git a/arch/blackfin/mach-bf533/boards/cm_bf533.c b/arch/blackfin/mach-bf533/boards/cm_bf533.c index 7443b26c80c5..7fc3b860d4ae 100644 --- a/arch/blackfin/mach-bf533/boards/cm_bf533.c +++ b/arch/blackfin/mach-bf533/boards/cm_bf533.c | |||
| @@ -1,30 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/boards/cm_bf533.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/ezkit.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> Copyright 2005 | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: 2005 | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board description file | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 8 | */ |
| 29 | 9 | ||
| 30 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -261,19 +241,6 @@ static struct platform_device smsc911x_device = { | |||
| 261 | }; | 241 | }; |
| 262 | #endif | 242 | #endif |
| 263 | 243 | ||
| 264 | static struct resource bfin_gpios_resources = { | ||
| 265 | .start = 0, | ||
| 266 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 267 | .flags = IORESOURCE_IRQ, | ||
| 268 | }; | ||
| 269 | |||
| 270 | static struct platform_device bfin_gpios_device = { | ||
| 271 | .name = "simple-gpio", | ||
| 272 | .id = -1, | ||
| 273 | .num_resources = 1, | ||
| 274 | .resource = &bfin_gpios_resources, | ||
| 275 | }; | ||
| 276 | |||
| 277 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 244 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
| 278 | static struct resource bfin_uart_resources[] = { | 245 | static struct resource bfin_uart_resources[] = { |
| 279 | { | 246 | { |
| @@ -506,8 +473,6 @@ static struct platform_device *cm_bf533_devices[] __initdata = { | |||
| 506 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 473 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 507 | ¶_flash_device, | 474 | ¶_flash_device, |
| 508 | #endif | 475 | #endif |
| 509 | |||
| 510 | &bfin_gpios_device, | ||
| 511 | }; | 476 | }; |
| 512 | 477 | ||
| 513 | static int __init cm_bf533_init(void) | 478 | static int __init cm_bf533_init(void) |
diff --git a/arch/blackfin/mach-bf533/boards/ezkit.c b/arch/blackfin/mach-bf533/boards/ezkit.c index fd518e383b79..d4689dcc198e 100644 --- a/arch/blackfin/mach-bf533/boards/ezkit.c +++ b/arch/blackfin/mach-bf533/boards/ezkit.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/ezkit.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: Original Work | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: 2005 | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: Robin Getz <rgetz@blackfin.uclinux.org> - Named the boards | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -33,12 +11,14 @@ | |||
| 33 | #include <linux/mtd/mtd.h> | 11 | #include <linux/mtd/mtd.h> |
| 34 | #include <linux/mtd/partitions.h> | 12 | #include <linux/mtd/partitions.h> |
| 35 | #include <linux/mtd/plat-ram.h> | 13 | #include <linux/mtd/plat-ram.h> |
| 14 | #include <linux/mtd/physmap.h> | ||
| 36 | #include <linux/spi/spi.h> | 15 | #include <linux/spi/spi.h> |
| 37 | #include <linux/spi/flash.h> | 16 | #include <linux/spi/flash.h> |
| 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 17 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 39 | #include <linux/usb/isp1362.h> | 18 | #include <linux/usb/isp1362.h> |
| 40 | #endif | 19 | #endif |
| 41 | #include <linux/irq.h> | 20 | #include <linux/irq.h> |
| 21 | #include <linux/i2c.h> | ||
| 42 | #include <asm/dma.h> | 22 | #include <asm/dma.h> |
| 43 | #include <asm/bfin5xx_spi.h> | 23 | #include <asm/bfin5xx_spi.h> |
| 44 | #include <asm/portmux.h> | 24 | #include <asm/portmux.h> |
| @@ -56,12 +36,6 @@ static struct platform_device rtc_device = { | |||
| 56 | }; | 36 | }; |
| 57 | #endif | 37 | #endif |
| 58 | 38 | ||
| 59 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 60 | static struct platform_device bfin_fb_adv7393_device = { | ||
| 61 | .name = "bfin-adv7393", | ||
| 62 | }; | ||
| 63 | #endif | ||
| 64 | |||
| 65 | /* | 39 | /* |
| 66 | * USB-LAN EzExtender board | 40 | * USB-LAN EzExtender board |
| 67 | * Driver needs to know address, irq and flag pin. | 41 | * Driver needs to know address, irq and flag pin. |
| @@ -98,54 +72,69 @@ static struct platform_device smc91x_device = { | |||
| 98 | }; | 72 | }; |
| 99 | #endif | 73 | #endif |
| 100 | 74 | ||
| 101 | #if defined(CONFIG_MTD_PSD4256G) || defined(CONFIG_MTD_PSD4256G_MODULE) | 75 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 102 | static const char *map_probes[] = { | 76 | static struct mtd_partition ezkit_partitions_a[] = { |
| 103 | "stm_flash", | 77 | { |
| 104 | NULL, | 78 | .name = "bootloader(nor a)", |
| 79 | .size = 0x40000, | ||
| 80 | .offset = 0, | ||
| 81 | }, { | ||
| 82 | .name = "linux kernel(nor a)", | ||
| 83 | .size = MTDPART_SIZ_FULL, | ||
| 84 | .offset = MTDPART_OFS_APPEND, | ||
| 85 | }, | ||
| 105 | }; | 86 | }; |
| 106 | 87 | ||
| 107 | static struct platdata_mtd_ram stm_pri_data_a = { | 88 | static struct physmap_flash_data ezkit_flash_data_a = { |
| 108 | .mapname = "Flash A Primary", | 89 | .width = 2, |
| 109 | .map_probes = map_probes, | 90 | .parts = ezkit_partitions_a, |
| 110 | .bankwidth = 2, | 91 | .nr_parts = ARRAY_SIZE(ezkit_partitions_a), |
| 111 | }; | 92 | }; |
| 112 | 93 | ||
| 113 | static struct resource stm_pri_resource_a = { | 94 | static struct resource ezkit_flash_resource_a = { |
| 114 | .start = 0x20000000, | 95 | .start = 0x20000000, |
| 115 | .end = 0x200fffff, | 96 | .end = 0x200fffff, |
| 116 | .flags = IORESOURCE_MEM, | 97 | .flags = IORESOURCE_MEM, |
| 117 | }; | 98 | }; |
| 118 | 99 | ||
| 119 | static struct platform_device stm_pri_device_a = { | 100 | static struct platform_device ezkit_flash_device_a = { |
| 120 | .name = "mtd-ram", | 101 | .name = "physmap-flash", |
| 121 | .id = 0, | 102 | .id = 0, |
| 122 | .dev = { | 103 | .dev = { |
| 123 | .platform_data = &stm_pri_data_a, | 104 | .platform_data = &ezkit_flash_data_a, |
| 124 | }, | 105 | }, |
| 125 | .num_resources = 1, | 106 | .num_resources = 1, |
| 126 | .resource = &stm_pri_resource_a, | 107 | .resource = &ezkit_flash_resource_a, |
| 108 | }; | ||
| 109 | |||
| 110 | static struct mtd_partition ezkit_partitions_b[] = { | ||
| 111 | { | ||
| 112 | .name = "file system(nor b)", | ||
| 113 | .size = MTDPART_SIZ_FULL, | ||
| 114 | .offset = MTDPART_OFS_APPEND, | ||
| 115 | }, | ||
| 127 | }; | 116 | }; |
| 128 | 117 | ||
| 129 | static struct platdata_mtd_ram stm_pri_data_b = { | 118 | static struct physmap_flash_data ezkit_flash_data_b = { |
| 130 | .mapname = "Flash B Primary", | 119 | .width = 2, |
| 131 | .map_probes = map_probes, | 120 | .parts = ezkit_partitions_b, |
| 132 | .bankwidth = 2, | 121 | .nr_parts = ARRAY_SIZE(ezkit_partitions_b), |
| 133 | }; | 122 | }; |
| 134 | 123 | ||
| 135 | static struct resource stm_pri_resource_b = { | 124 | static struct resource ezkit_flash_resource_b = { |
| 136 | .start = 0x20100000, | 125 | .start = 0x20100000, |
| 137 | .end = 0x201fffff, | 126 | .end = 0x201fffff, |
| 138 | .flags = IORESOURCE_MEM, | 127 | .flags = IORESOURCE_MEM, |
| 139 | }; | 128 | }; |
| 140 | 129 | ||
| 141 | static struct platform_device stm_pri_device_b = { | 130 | static struct platform_device ezkit_flash_device_b = { |
| 142 | .name = "mtd-ram", | 131 | .name = "physmap-flash", |
| 143 | .id = 4, | 132 | .id = 4, |
| 144 | .dev = { | 133 | .dev = { |
| 145 | .platform_data = &stm_pri_data_b, | 134 | .platform_data = &ezkit_flash_data_b, |
| 146 | }, | 135 | }, |
| 147 | .num_resources = 1, | 136 | .num_resources = 1, |
| 148 | .resource = &stm_pri_resource_b, | 137 | .resource = &ezkit_flash_resource_b, |
| 149 | }; | 138 | }; |
| 150 | #endif | 139 | #endif |
| 151 | 140 | ||
| @@ -400,19 +389,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 400 | }; | 389 | }; |
| 401 | #endif | 390 | #endif |
| 402 | 391 | ||
| 403 | static struct resource bfin_gpios_resources = { | ||
| 404 | .start = 0, | ||
| 405 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 406 | .flags = IORESOURCE_IRQ, | ||
| 407 | }; | ||
| 408 | |||
| 409 | static struct platform_device bfin_gpios_device = { | ||
| 410 | .name = "simple-gpio", | ||
| 411 | .id = -1, | ||
| 412 | .num_resources = 1, | ||
| 413 | .resource = &bfin_gpios_resources, | ||
| 414 | }; | ||
| 415 | |||
| 416 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 392 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
| 417 | #include <linux/i2c-gpio.h> | 393 | #include <linux/i2c-gpio.h> |
| 418 | 394 | ||
| @@ -460,13 +436,21 @@ static struct platform_device bfin_dpmc = { | |||
| 460 | }, | 436 | }, |
| 461 | }; | 437 | }; |
| 462 | 438 | ||
| 439 | static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | ||
| 440 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 441 | { | ||
| 442 | I2C_BOARD_INFO("bfin-adv7393", 0x2B), | ||
| 443 | }, | ||
| 444 | #endif | ||
| 445 | }; | ||
| 446 | |||
| 463 | static struct platform_device *ezkit_devices[] __initdata = { | 447 | static struct platform_device *ezkit_devices[] __initdata = { |
| 464 | 448 | ||
| 465 | &bfin_dpmc, | 449 | &bfin_dpmc, |
| 466 | 450 | ||
| 467 | #if defined(CONFIG_MTD_PSD4256G) || defined(CONFIG_MTD_PSD4256G_MODULE) | 451 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 468 | &stm_pri_device_a, | 452 | &ezkit_flash_device_a, |
| 469 | &stm_pri_device_b, | 453 | &ezkit_flash_device_b, |
| 470 | #endif | 454 | #endif |
| 471 | 455 | ||
| 472 | #if defined(CONFIG_MTD_PLATRAM) || defined(CONFIG_MTD_PLATRAM_MODULE) | 456 | #if defined(CONFIG_MTD_PLATRAM) || defined(CONFIG_MTD_PLATRAM_MODULE) |
| @@ -482,10 +466,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
| 482 | &bfin_spi0_device, | 466 | &bfin_spi0_device, |
| 483 | #endif | 467 | #endif |
| 484 | 468 | ||
| 485 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 486 | &bfin_fb_adv7393_device, | ||
| 487 | #endif | ||
| 488 | |||
| 489 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | 469 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) |
| 490 | &rtc_device, | 470 | &rtc_device, |
| 491 | #endif | 471 | #endif |
| @@ -507,8 +487,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
| 507 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 487 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
| 508 | &i2c_gpio_device, | 488 | &i2c_gpio_device, |
| 509 | #endif | 489 | #endif |
| 510 | |||
| 511 | &bfin_gpios_device, | ||
| 512 | }; | 490 | }; |
| 513 | 491 | ||
| 514 | static int __init ezkit_init(void) | 492 | static int __init ezkit_init(void) |
| @@ -516,6 +494,8 @@ static int __init ezkit_init(void) | |||
| 516 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | 494 | printk(KERN_INFO "%s(): registering device resources\n", __func__); |
| 517 | platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); | 495 | platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); |
| 518 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 496 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
| 497 | i2c_register_board_info(0, bfin_i2c_board_info, | ||
| 498 | ARRAY_SIZE(bfin_i2c_board_info)); | ||
| 519 | return 0; | 499 | return 0; |
| 520 | } | 500 | } |
| 521 | 501 | ||
diff --git a/arch/blackfin/mach-bf533/boards/ip0x.c b/arch/blackfin/mach-bf533/boards/ip0x.c index f19b63378b12..644be5e5ab6f 100644 --- a/arch/blackfin/mach-bf533/boards/ip0x.c +++ b/arch/blackfin/mach-bf533/boards/ip0x.c | |||
| @@ -1,34 +1,12 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/ip0x.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/bf1.c | 3 | * 2007 David Rowe |
| 4 | * Based on: arch/blackfin/mach-bf533/stamp.c | 4 | * 2006 Intratrade Ltd. |
| 5 | * Author: Ivan Danov <idanov@gmail.com> | 5 | * Ivan Danov <idanov@gmail.com> |
| 6 | * Modified for IP0X David Rowe | 6 | * 2005 National ICT Australia (NICTA) |
| 7 | * Aidan Williams <aidan@nicta.com.au> | ||
| 7 | * | 8 | * |
| 8 | * Created: 2007 | 9 | * Licensed under the GPL-2 or later. |
| 9 | * Description: Board info file for the IP04/IP08 boards, which | ||
| 10 | * are derived from the BlackfinOne V2.0 boards. | ||
| 11 | * | ||
| 12 | * Modified: | ||
| 13 | * COpyright 2007 David Rowe | ||
| 14 | * Copyright 2006 Intratrade Ltd. | ||
| 15 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 16 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 17 | * | ||
| 18 | * This program is free software; you can redistribute it and/or modify | ||
| 19 | * it under the terms of the GNU General Public License as published by | ||
| 20 | * the Free Software Foundation; either version 2 of the License, or | ||
| 21 | * (at your option) any later version. | ||
| 22 | * | ||
| 23 | * This program is distributed in the hope that it will be useful, | ||
| 24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 26 | * GNU General Public License for more details. | ||
| 27 | * | ||
| 28 | * You should have received a copy of the GNU General Public License | ||
| 29 | * along with this program; if not, see the file COPYING, or write | ||
| 30 | * to the Free Software Foundation, Inc., | ||
| 31 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 32 | */ | 10 | */ |
| 33 | 11 | ||
| 34 | #include <linux/device.h> | 12 | #include <linux/device.h> |
| @@ -145,7 +123,6 @@ static struct bfin5xx_spi_chip mmc_spi_chip_info = { | |||
| 145 | .ctl_reg = 0x1000, /* CPOL=0,CPHA=0,Sandisk 1G work */ | 123 | .ctl_reg = 0x1000, /* CPOL=0,CPHA=0,Sandisk 1G work */ |
| 146 | .enable_dma = 0, /* if 1 - block!!! */ | 124 | .enable_dma = 0, /* if 1 - block!!! */ |
| 147 | .bits_per_word = 8, | 125 | .bits_per_word = 8, |
| 148 | .cs_change_per_word = 0, | ||
| 149 | }; | 126 | }; |
| 150 | #endif | 127 | #endif |
| 151 | 128 | ||
diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c index 729fd7c26336..82f70efd66e7 100644 --- a/arch/blackfin/mach-bf533/boards/stamp.c +++ b/arch/blackfin/mach-bf533/boards/stamp.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/stamp.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/ezkit.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: 2005 | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board Info File for the BF533-STAMP | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -95,12 +73,6 @@ static struct platform_device smc91x_device = { | |||
| 95 | }; | 73 | }; |
| 96 | #endif | 74 | #endif |
| 97 | 75 | ||
| 98 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 99 | static struct platform_device bfin_fb_adv7393_device = { | ||
| 100 | .name = "bfin-adv7393", | ||
| 101 | }; | ||
| 102 | #endif | ||
| 103 | |||
| 104 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) | 76 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) |
| 105 | static struct resource net2272_bfin_resources[] = { | 77 | static struct resource net2272_bfin_resources[] = { |
| 106 | { | 78 | { |
| @@ -436,19 +408,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 436 | }; | 408 | }; |
| 437 | #endif | 409 | #endif |
| 438 | 410 | ||
| 439 | static struct resource bfin_gpios_resources = { | ||
| 440 | .start = 0, | ||
| 441 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 442 | .flags = IORESOURCE_IRQ, | ||
| 443 | }; | ||
| 444 | |||
| 445 | static struct platform_device bfin_gpios_device = { | ||
| 446 | .name = "simple-gpio", | ||
| 447 | .id = -1, | ||
| 448 | .num_resources = 1, | ||
| 449 | .resource = &bfin_gpios_resources, | ||
| 450 | }; | ||
| 451 | |||
| 452 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 411 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
| 453 | #include <linux/i2c-gpio.h> | 412 | #include <linux/i2c-gpio.h> |
| 454 | 413 | ||
| @@ -487,6 +446,11 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | |||
| 487 | .irq = 39, | 446 | .irq = 39, |
| 488 | }, | 447 | }, |
| 489 | #endif | 448 | #endif |
| 449 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 450 | { | ||
| 451 | I2C_BOARD_INFO("bfin-adv7393", 0x2B), | ||
| 452 | }, | ||
| 453 | #endif | ||
| 490 | }; | 454 | }; |
| 491 | 455 | ||
| 492 | static const unsigned int cclk_vlev_datasheet[] = | 456 | static const unsigned int cclk_vlev_datasheet[] = |
| @@ -528,10 +492,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 528 | &smc91x_device, | 492 | &smc91x_device, |
| 529 | #endif | 493 | #endif |
| 530 | 494 | ||
| 531 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 532 | &bfin_fb_adv7393_device, | ||
| 533 | #endif | ||
| 534 | |||
| 535 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) | 495 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) |
| 536 | &net2272_bfin_device, | 496 | &net2272_bfin_device, |
| 537 | #endif | 497 | #endif |
| @@ -563,8 +523,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 563 | &i2c_gpio_device, | 523 | &i2c_gpio_device, |
| 564 | #endif | 524 | #endif |
| 565 | 525 | ||
| 566 | &bfin_gpios_device, | ||
| 567 | |||
| 568 | #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE) | 526 | #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE) |
| 569 | &stamp_flash_device, | 527 | &stamp_flash_device, |
| 570 | #endif | 528 | #endif |
diff --git a/arch/blackfin/mach-bf533/dma.c b/arch/blackfin/mach-bf533/dma.c index 7a443c37fb9f..4a14a46a9a68 100644 --- a/arch/blackfin/mach-bf533/dma.c +++ b/arch/blackfin/mach-bf533/dma.c | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/dma.c | 2 | * simple DMA Implementation for Blackfin |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 8 | |||
| 29 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-bf533/include/mach/bf533.h b/arch/blackfin/mach-bf533/include/mach/bf533.h index cf4427cd3f72..e3e05f8f7af9 100644 --- a/arch/blackfin/mach-bf533/include/mach/bf533.h +++ b/arch/blackfin/mach-bf533/include/mach/bf533.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf533/bf533.h | 2 | * SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2005-2008 Analog Devices Inc. |
| 7 | * Description: SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef __MACH_BF533_H__ | 9 | #ifndef __MACH_BF533_H__ |
diff --git a/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h index 6965b4088c44..9e1f3defb6bc 100644 --- a/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf533/bfin_serial_5xx.h | 2 | * Copyright 2006-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * blackfin serial driver head file | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf533/include/mach/blackfin.h b/arch/blackfin/mach-bf533/include/mach/blackfin.h index 499e897a4f4f..f4bd6df5d968 100644 --- a/arch/blackfin/mach-bf533/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf533/include/mach/blackfin.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf533/blackfin.h | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf533/include/mach/cdefBF532.h b/arch/blackfin/mach-bf533/include/mach/cdefBF532.h index bbc3c8386d48..feb2392c43ea 100644 --- a/arch/blackfin/mach-bf533/include/mach/cdefBF532.h +++ b/arch/blackfin/mach-bf533/include/mach/cdefBF532.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf533/cdefBF532.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF532_H | 7 | #ifndef _CDEF_BF532_H |
diff --git a/arch/blackfin/mach-bf533/include/mach/defBF532.h b/arch/blackfin/mach-bf533/include/mach/defBF532.h index 7f4633223e6d..02b328eb0e07 100644 --- a/arch/blackfin/mach-bf533/include/mach/defBF532.h +++ b/arch/blackfin/mach-bf533/include/mach/defBF532.h | |||
| @@ -1,48 +1,10 @@ | |||
| 1 | /************************************************************************ | ||
| 2 | * | ||
| 3 | * This file is subject to the terms and conditions of the GNU Public | ||
| 4 | * License. See the file "COPYING" in the main directory of this archive | ||
| 5 | * for more details. | ||
| 6 | * | ||
| 7 | * Non-GPL License also available as part of VisualDSP++ | ||
| 8 | * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html | ||
| 9 | * | ||
| 10 | * (c) Copyright 2001-2005 Analog Devices, Inc. All rights reserved | ||
| 11 | * | ||
| 12 | * This file under source code control, please send bugs or changes to: | ||
| 13 | * dsptools.support@analog.com | ||
| 14 | * | ||
| 15 | ************************************************************************/ | ||
| 16 | /* | 1 | /* |
| 17 | * File: include/asm-blackfin/mach-bf533/defBF532.h | 2 | * System & MMR bit and Address definitions for ADSP-BF532 |
| 18 | * Based on: | ||
| 19 | * Author: | ||
| 20 | * | ||
| 21 | * Created: | ||
| 22 | * Description: | ||
| 23 | * | ||
| 24 | * Rev: | ||
| 25 | * | ||
| 26 | * Modified: | ||
| 27 | * | ||
| 28 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 29 | * | ||
| 30 | * This program is free software; you can redistribute it and/or modify | ||
| 31 | * it under the terms of the GNU General Public License as published by | ||
| 32 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 33 | * any later version. | ||
| 34 | * | 3 | * |
| 35 | * This program is distributed in the hope that it will be useful, | 4 | * Copyright 2005-2008 Analog Devices Inc. |
| 36 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 37 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 38 | * GNU General Public License for more details. | ||
| 39 | * | 5 | * |
| 40 | * You should have received a copy of the GNU General Public License | 6 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 41 | * along with this program; see the file COPYING. | ||
| 42 | * If not, write to the Free Software Foundation, | ||
| 43 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 44 | */ | 7 | */ |
| 45 | /* SYSTEM & MM REGISTER BIT & ADDRESS DEFINITIONS FOR ADSP-BF532 */ | ||
| 46 | 8 | ||
| 47 | #ifndef _DEF_BF532_H | 9 | #ifndef _DEF_BF532_H |
| 48 | #define _DEF_BF532_H | 10 | #define _DEF_BF532_H |
diff --git a/arch/blackfin/mach-bf533/include/mach/gpio.h b/arch/blackfin/mach-bf533/include/mach/gpio.h index e45c17077aff..2af19d69a7a7 100644 --- a/arch/blackfin/mach-bf533/include/mach/gpio.h +++ b/arch/blackfin/mach-bf533/include/mach/gpio.h | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/include/mach/gpio.h | ||
| 3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 4 | * | ||
| 5 | * Copyright (C) 2008 Analog Devices Inc. | 2 | * Copyright (C) 2008 Analog Devices Inc. |
| 6 | * Licensed under the GPL-2 or later. | 3 | * Licensed under the GPL-2 or later. |
| 7 | */ | 4 | */ |
diff --git a/arch/blackfin/mach-bf533/include/mach/irq.h b/arch/blackfin/mach-bf533/include/mach/irq.h index db1e346cd1aa..c31498be0bbb 100644 --- a/arch/blackfin/mach-bf533/include/mach/irq.h +++ b/arch/blackfin/mach-bf533/include/mach/irq.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf533/defBF532.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _BF533_IRQ_H_ | 7 | #ifndef _BF533_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf533/include/mach/portmux.h b/arch/blackfin/mach-bf533/include/mach/portmux.h index 2f59ce0b0cb5..075dae1af164 100644 --- a/arch/blackfin/mach-bf533/include/mach/portmux.h +++ b/arch/blackfin/mach-bf533/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf533/ints-priority.c b/arch/blackfin/mach-bf533/ints-priority.c index f51994b7a2b9..8f714cf8135b 100644 --- a/arch/blackfin/mach-bf533/ints-priority.c +++ b/arch/blackfin/mach-bf533/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/ints-priority.c | 2 | * Set up the interrupt priorities |
| 3 | * Based on: | ||
| 4 | * Author: Michael Hennerich | ||
| 5 | * | 3 | * |
| 6 | * Created: ? | 4 | * Copyright 2005-2009 Analog Devices Inc. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537e.c b/arch/blackfin/mach-bf537/boards/cm_bf537e.c index 87acb7dd2df3..c85f4d770535 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537e.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537e.c | |||
| @@ -1,31 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/boards/cm_bf537.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/ezkit.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: 2005 | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board description file | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 8 | */ |
| 30 | 9 | ||
| 31 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -297,19 +276,6 @@ static struct platform_device net2272_bfin_device = { | |||
| 297 | }; | 276 | }; |
| 298 | #endif | 277 | #endif |
| 299 | 278 | ||
| 300 | static struct resource bfin_gpios_resources = { | ||
| 301 | .start = 0, | ||
| 302 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 303 | .flags = IORESOURCE_IRQ, | ||
| 304 | }; | ||
| 305 | |||
| 306 | static struct platform_device bfin_gpios_device = { | ||
| 307 | .name = "simple-gpio", | ||
| 308 | .id = -1, | ||
| 309 | .num_resources = 1, | ||
| 310 | .resource = &bfin_gpios_resources, | ||
| 311 | }; | ||
| 312 | |||
| 313 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 279 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 314 | static struct mtd_partition cm_partitions[] = { | 280 | static struct mtd_partition cm_partitions[] = { |
| 315 | { | 281 | { |
| @@ -699,8 +665,6 @@ static struct platform_device *cm_bf537e_devices[] __initdata = { | |||
| 699 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 665 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 700 | &cm_flash_device, | 666 | &cm_flash_device, |
| 701 | #endif | 667 | #endif |
| 702 | |||
| 703 | &bfin_gpios_device, | ||
| 704 | }; | 668 | }; |
| 705 | 669 | ||
| 706 | static int __init cm_bf537e_init(void) | 670 | static int __init cm_bf537e_init(void) |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537u.c b/arch/blackfin/mach-bf537/boards/cm_bf537u.c index 8219dc3d65bd..ea11aa81340d 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537u.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537u.c | |||
| @@ -1,31 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/boards/cm_bf537u.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/ezkit.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: 2005 | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board description file | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 8 | */ |
| 30 | 9 | ||
| 31 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -298,19 +277,6 @@ static struct platform_device net2272_bfin_device = { | |||
| 298 | }; | 277 | }; |
| 299 | #endif | 278 | #endif |
| 300 | 279 | ||
| 301 | static struct resource bfin_gpios_resources = { | ||
| 302 | .start = 0, | ||
| 303 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 304 | .flags = IORESOURCE_IRQ, | ||
| 305 | }; | ||
| 306 | |||
| 307 | static struct platform_device bfin_gpios_device = { | ||
| 308 | .name = "simple-gpio", | ||
| 309 | .id = -1, | ||
| 310 | .num_resources = 1, | ||
| 311 | .resource = &bfin_gpios_resources, | ||
| 312 | }; | ||
| 313 | |||
| 314 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 280 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 315 | static struct mtd_partition cm_partitions[] = { | 281 | static struct mtd_partition cm_partitions[] = { |
| 316 | { | 282 | { |
| @@ -605,8 +571,6 @@ static struct platform_device *cm_bf537u_devices[] __initdata = { | |||
| 605 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 571 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 606 | &cm_flash_device, | 572 | &cm_flash_device, |
| 607 | #endif | 573 | #endif |
| 608 | |||
| 609 | &bfin_gpios_device, | ||
| 610 | }; | 574 | }; |
| 611 | 575 | ||
| 612 | static int __init cm_bf537u_init(void) | 576 | static int __init cm_bf537u_init(void) |
diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c index 399f81da7b93..0da927252701 100644 --- a/arch/blackfin/mach-bf537/boards/minotaur.c +++ b/arch/blackfin/mach-bf537/boards/minotaur.c | |||
| @@ -1,4 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright 2004-2009 Analog Devices Inc. | ||
| 3 | * 2008-2009 Cambridge Signal Processing | ||
| 4 | * 2005 National ICT Australia (NICTA) | ||
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 6 | * | ||
| 7 | * Licensed under the GPL-2 or later. | ||
| 2 | */ | 8 | */ |
| 3 | 9 | ||
| 4 | #include <linux/device.h> | 10 | #include <linux/device.h> |
diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c index 10b35b838bac..9ba290466b56 100644 --- a/arch/blackfin/mach-bf537/boards/pnav10.c +++ b/arch/blackfin/mach-bf537/boards/pnav10.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/boards/stamp.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/ezkit.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -302,7 +280,6 @@ static struct bfin5xx_spi_chip mmc_spi_chip_info = { | |||
| 302 | 280 | ||
| 303 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 281 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
| 304 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { | 282 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { |
| 305 | .cs_change_per_word = 0, | ||
| 306 | .enable_dma = 0, | 283 | .enable_dma = 0, |
| 307 | .bits_per_word = 16, | 284 | .bits_per_word = 16, |
| 308 | }; | 285 | }; |
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index 9db6b40743e0..c46baa5e6d9b 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/boards/stamp.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/ezkit.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -121,19 +99,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 121 | }; | 99 | }; |
| 122 | #endif | 100 | #endif |
| 123 | 101 | ||
| 124 | static struct resource bfin_gpios_resources = { | ||
| 125 | .start = 0, | ||
| 126 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 127 | .flags = IORESOURCE_IRQ, | ||
| 128 | }; | ||
| 129 | |||
| 130 | static struct platform_device bfin_gpios_device = { | ||
| 131 | .name = "simple-gpio", | ||
| 132 | .id = -1, | ||
| 133 | .num_resources = 1, | ||
| 134 | .resource = &bfin_gpios_resources, | ||
| 135 | }; | ||
| 136 | |||
| 137 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) | 102 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) |
| 138 | static struct resource bfin_pcmcia_cf_resources[] = { | 103 | static struct resource bfin_pcmcia_cf_resources[] = { |
| 139 | { | 104 | { |
| @@ -1078,12 +1043,6 @@ static struct platform_device bfin_fb_device = { | |||
| 1078 | }; | 1043 | }; |
| 1079 | #endif | 1044 | #endif |
| 1080 | 1045 | ||
| 1081 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 1082 | static struct platform_device bfin_fb_adv7393_device = { | ||
| 1083 | .name = "bfin-adv7393", | ||
| 1084 | }; | ||
| 1085 | #endif | ||
| 1086 | |||
| 1087 | #if defined(CONFIG_FB_BFIN_LQ035Q1) || defined(CONFIG_FB_BFIN_LQ035Q1_MODULE) | 1046 | #if defined(CONFIG_FB_BFIN_LQ035Q1) || defined(CONFIG_FB_BFIN_LQ035Q1_MODULE) |
| 1088 | #include <asm/bfin-lq035q1.h> | 1047 | #include <asm/bfin-lq035q1.h> |
| 1089 | 1048 | ||
| @@ -1498,6 +1457,11 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | |||
| 1498 | .platform_data = (void *)&adp5588_gpio_data, | 1457 | .platform_data = (void *)&adp5588_gpio_data, |
| 1499 | }, | 1458 | }, |
| 1500 | #endif | 1459 | #endif |
| 1460 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 1461 | { | ||
| 1462 | I2C_BOARD_INFO("bfin-adv7393", 0x2B), | ||
| 1463 | }, | ||
| 1464 | #endif | ||
| 1501 | }; | 1465 | }; |
| 1502 | 1466 | ||
| 1503 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | 1467 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) |
| @@ -1668,10 +1632,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 1668 | &bfin_lq035q1_device, | 1632 | &bfin_lq035q1_device, |
| 1669 | #endif | 1633 | #endif |
| 1670 | 1634 | ||
| 1671 | #if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) | ||
| 1672 | &bfin_fb_adv7393_device, | ||
| 1673 | #endif | ||
| 1674 | |||
| 1675 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 1635 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
| 1676 | &bfin_uart_device, | 1636 | &bfin_uart_device, |
| 1677 | #endif | 1637 | #endif |
| @@ -1702,8 +1662,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
| 1702 | &bfin_device_gpiokeys, | 1662 | &bfin_device_gpiokeys, |
| 1703 | #endif | 1663 | #endif |
| 1704 | 1664 | ||
| 1705 | &bfin_gpios_device, | ||
| 1706 | |||
| 1707 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | 1665 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) |
| 1708 | &bfin_async_nand_device, | 1666 | &bfin_async_nand_device, |
| 1709 | #endif | 1667 | #endif |
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c index 61353f7bcb9e..57163b65a4f5 100644 --- a/arch/blackfin/mach-bf537/boards/tcm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c | |||
| @@ -1,31 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/boards/tcm_bf537.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/cm_bf537.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: 2005 | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board description file | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 8 | */ |
| 30 | 9 | ||
| 31 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -298,19 +277,6 @@ static struct platform_device net2272_bfin_device = { | |||
| 298 | }; | 277 | }; |
| 299 | #endif | 278 | #endif |
| 300 | 279 | ||
| 301 | static struct resource bfin_gpios_resources = { | ||
| 302 | .start = 0, | ||
| 303 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 304 | .flags = IORESOURCE_IRQ, | ||
| 305 | }; | ||
| 306 | |||
| 307 | static struct platform_device bfin_gpios_device = { | ||
| 308 | .name = "simple-gpio", | ||
| 309 | .id = -1, | ||
| 310 | .num_resources = 1, | ||
| 311 | .resource = &bfin_gpios_resources, | ||
| 312 | }; | ||
| 313 | |||
| 314 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 280 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 315 | static struct mtd_partition cm_partitions[] = { | 281 | static struct mtd_partition cm_partitions[] = { |
| 316 | { | 282 | { |
| @@ -607,8 +573,6 @@ static struct platform_device *cm_bf537_devices[] __initdata = { | |||
| 607 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | 573 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) |
| 608 | &cm_flash_device, | 574 | &cm_flash_device, |
| 609 | #endif | 575 | #endif |
| 610 | |||
| 611 | &bfin_gpios_device, | ||
| 612 | }; | 576 | }; |
| 613 | 577 | ||
| 614 | static int __init tcm_bf537_init(void) | 578 | static int __init tcm_bf537_init(void) |
diff --git a/arch/blackfin/mach-bf537/dma.c b/arch/blackfin/mach-bf537/dma.c index d23fc0edf2b9..5c8c4ed517bb 100644 --- a/arch/blackfin/mach-bf537/dma.c +++ b/arch/blackfin/mach-bf537/dma.c | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/dma.c | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * This file contains the simple DMA Implementation for Blackfin |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 8 | |||
| 29 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-bf537/include/mach/bf537.h b/arch/blackfin/mach-bf537/include/mach/bf537.h index f194a848ae8e..17fab4474669 100644 --- a/arch/blackfin/mach-bf537/include/mach/bf537.h +++ b/arch/blackfin/mach-bf537/include/mach/bf537.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf537/bf537.h | 2 | * System MMR Register and memory map for ADSP-BF537 |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2005-2008 Analog Devices Inc. |
| 7 | * Description: SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF537 | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef __MACH_BF537_H__ | 9 | #ifndef __MACH_BF537_H__ |
diff --git a/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h index e95d54f9af6c..635c91c526a3 100644 --- a/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf537/bfin_serial_5xx.h | 2 | * Copyright 2006-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * blackfin serial driver header files | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf537/include/mach/blackfin.h b/arch/blackfin/mach-bf537/include/mach/blackfin.h index 9ee8834c8f1a..eab006d260c5 100644 --- a/arch/blackfin/mach-bf537/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf537/include/mach/blackfin.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf537/blackfin.h | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf537/include/mach/cdefBF534.h b/arch/blackfin/mach-bf537/include/mach/cdefBF534.h index 5f8b5f845be6..91825c9bd226 100644 --- a/arch/blackfin/mach-bf537/include/mach/cdefBF534.h +++ b/arch/blackfin/mach-bf537/include/mach/cdefBF534.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf537/cdefbf534.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: system mmr register map | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF534_H | 7 | #ifndef _CDEF_BF534_H |
diff --git a/arch/blackfin/mach-bf537/include/mach/cdefBF537.h b/arch/blackfin/mach-bf537/include/mach/cdefBF537.h index b8fc949a991f..9363c3990421 100644 --- a/arch/blackfin/mach-bf537/include/mach/cdefBF537.h +++ b/arch/blackfin/mach-bf537/include/mach/cdefBF537.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf537/cdefBF537.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * Description: | ||
| 8 | * System MMR Register Map | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _CDEF_BF537_H | 7 | #ifndef _CDEF_BF537_H |
diff --git a/arch/blackfin/mach-bf537/include/mach/defBF534.h b/arch/blackfin/mach-bf537/include/mach/defBF534.h index a3227f9003ff..cebb14feb1ba 100644 --- a/arch/blackfin/mach-bf537/include/mach/defBF534.h +++ b/arch/blackfin/mach-bf537/include/mach/defBF534.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf537/cdefBF537.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF534_H | 7 | #ifndef _DEF_BF534_H |
diff --git a/arch/blackfin/mach-bf537/include/mach/defBF537.h b/arch/blackfin/mach-bf537/include/mach/defBF537.h index 3d6c83e31b1e..8cb5d5cf0c94 100644 --- a/arch/blackfin/mach-bf537/include/mach/defBF537.h +++ b/arch/blackfin/mach-bf537/include/mach/defBF537.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf537/defbf537.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * description: | ||
| 8 | * system mmr register map | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _DEF_BF537_H | 7 | #ifndef _DEF_BF537_H |
diff --git a/arch/blackfin/mach-bf537/include/mach/gpio.h b/arch/blackfin/mach-bf537/include/mach/gpio.h index d77a31e45a30..104bff85290d 100644 --- a/arch/blackfin/mach-bf537/include/mach/gpio.h +++ b/arch/blackfin/mach-bf537/include/mach/gpio.h | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/include/mach/gpio.h | ||
| 3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 4 | * | ||
| 5 | * Copyright (C) 2008 Analog Devices Inc. | 2 | * Copyright (C) 2008 Analog Devices Inc. |
| 6 | * Licensed under the GPL-2 or later. | 3 | * Licensed under the GPL-2 or later. |
| 7 | */ | 4 | */ |
diff --git a/arch/blackfin/mach-bf537/include/mach/irq.h b/arch/blackfin/mach-bf537/include/mach/irq.h index b2a71d5d4e5f..0defa9457e7f 100644 --- a/arch/blackfin/mach-bf537/include/mach/irq.h +++ b/arch/blackfin/mach-bf537/include/mach/irq.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf537/irq.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later |
| 7 | * description: | ||
| 8 | * system mmr register map | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _BF537_IRQ_H_ | 7 | #ifndef _BF537_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf537/include/mach/portmux.h b/arch/blackfin/mach-bf537/include/mach/portmux.h index 87285e75e903..da9760329e49 100644 --- a/arch/blackfin/mach-bf537/include/mach/portmux.h +++ b/arch/blackfin/mach-bf537/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf537/ints-priority.c b/arch/blackfin/mach-bf537/ints-priority.c index 51c48087e03b..f6500622b35d 100644 --- a/arch/blackfin/mach-bf537/ints-priority.c +++ b/arch/blackfin/mach-bf537/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/ints-priority.c | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/ints-priority.c | ||
| 4 | * Author: Michael Hennerich | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Set up the interrupt priorities |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf538/boards/ezkit.c b/arch/blackfin/mach-bf538/boards/ezkit.c index f2ac3b0ebf24..14af5c2088d4 100644 --- a/arch/blackfin/mach-bf538/boards/ezkit.c +++ b/arch/blackfin/mach-bf538/boards/ezkit.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf538/boards/ezkit.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf537/boards/ezkit.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -237,7 +215,6 @@ static struct flash_platform_data bfin_spi_flash_data = { | |||
| 237 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | 215 | static struct bfin5xx_spi_chip spi_flash_chip_info = { |
| 238 | .enable_dma = 0, /* use dma transfer with this chip*/ | 216 | .enable_dma = 0, /* use dma transfer with this chip*/ |
| 239 | .bits_per_word = 8, | 217 | .bits_per_word = 8, |
| 240 | .cs_change_per_word = 0, | ||
| 241 | }; | 218 | }; |
| 242 | #endif | 219 | #endif |
| 243 | 220 | ||
| @@ -506,19 +483,6 @@ static struct platform_device i2c_bfin_twi1_device = { | |||
| 506 | #endif | 483 | #endif |
| 507 | #endif | 484 | #endif |
| 508 | 485 | ||
| 509 | static struct resource bfin_gpios_resources = { | ||
| 510 | .start = 0, | ||
| 511 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 512 | .flags = IORESOURCE_IRQ, | ||
| 513 | }; | ||
| 514 | |||
| 515 | static struct platform_device bfin_gpios_device = { | ||
| 516 | .name = "simple-gpio", | ||
| 517 | .id = -1, | ||
| 518 | .num_resources = 1, | ||
| 519 | .resource = &bfin_gpios_resources, | ||
| 520 | }; | ||
| 521 | |||
| 522 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 486 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
| 523 | #include <linux/gpio_keys.h> | 487 | #include <linux/gpio_keys.h> |
| 524 | 488 | ||
| @@ -658,8 +622,6 @@ static struct platform_device *cm_bf538_devices[] __initdata = { | |||
| 658 | &bfin_device_gpiokeys, | 622 | &bfin_device_gpiokeys, |
| 659 | #endif | 623 | #endif |
| 660 | 624 | ||
| 661 | &bfin_gpios_device, | ||
| 662 | |||
| 663 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 625 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 664 | &ezkit_flash_device, | 626 | &ezkit_flash_device, |
| 665 | #endif | 627 | #endif |
diff --git a/arch/blackfin/mach-bf538/dma.c b/arch/blackfin/mach-bf538/dma.c index d6837fbf94ea..5dc022589214 100644 --- a/arch/blackfin/mach-bf538/dma.c +++ b/arch/blackfin/mach-bf538/dma.c | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf538/dma.c | 2 | * the simple DMA Implementation for Blackfin |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2008 Analog Devices Inc. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 8 | |||
| 29 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-bf538/include/mach/bf538.h b/arch/blackfin/mach-bf538/include/mach/bf538.h index 9c8abb307908..0cf5bf8dab84 100644 --- a/arch/blackfin/mach-bf538/include/mach/bf538.h +++ b/arch/blackfin/mach-bf538/include/mach/bf538.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf538/bf538.h | 2 | * SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF538 |
| 3 | * Based on: include/asm-blackfin/mach-bf537/bf537.h | ||
| 4 | * Author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2008 Analog Devices Inc. |
| 7 | * Description: SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF527 | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef __MACH_BF538_H__ | 9 | #ifndef __MACH_BF538_H__ |
diff --git a/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h index 999f239fe1a6..5c148142f041 100644 --- a/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf538/bfin_serial_5xx.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * description: | ||
| 8 | * blackfin serial driver header files | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf538/include/mach/blackfin.h b/arch/blackfin/mach-bf538/include/mach/blackfin.h index 5ecee1690957..278e8942eef2 100644 --- a/arch/blackfin/mach-bf538/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf538/include/mach/blackfin.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf538/blackfin.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf538/include/mach/cdefBF538.h b/arch/blackfin/mach-bf538/include/mach/cdefBF538.h index 1de67515dc9d..401ebd79d0aa 100644 --- a/arch/blackfin/mach-bf538/include/mach/cdefBF538.h +++ b/arch/blackfin/mach-bf538/include/mach/cdefBF538.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf538/cdefBF538.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF538_H | 7 | #ifndef _CDEF_BF538_H |
diff --git a/arch/blackfin/mach-bf538/include/mach/defBF539.h b/arch/blackfin/mach-bf538/include/mach/defBF539.h index 1c58914a8740..5f6c34dfd08e 100644 --- a/arch/blackfin/mach-bf538/include/mach/defBF539.h +++ b/arch/blackfin/mach-bf538/include/mach/defBF539.h | |||
| @@ -1,47 +1,9 @@ | |||
| 1 | /************************************************************************ | ||
| 2 | * | ||
| 3 | * This file is subject to the terms and conditions of the GNU Public | ||
| 4 | * License. See the file "COPYING" in the main directory of this archive | ||
| 5 | * for more details. | ||
| 6 | * | ||
| 7 | * Non-GPL License also available as part of VisualDSP++ | ||
| 8 | * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html | ||
| 9 | * | ||
| 10 | * (c) Copyright 2001-2005 Analog Devices, Inc. All rights reserved | ||
| 11 | * | ||
| 12 | * This file under source code control, please send bugs or changes to: | ||
| 13 | * dsptools.support@analog.com | ||
| 14 | * | ||
| 15 | ************************************************************************/ | ||
| 16 | /* | 1 | /* |
| 17 | * File: include/asm-blackfin/mach-bf538/defBF539.h | 2 | * Copyright 2008-2009 Analog Devices Inc. |
| 18 | * Based on: | ||
| 19 | * Author: | ||
| 20 | * | ||
| 21 | * Created: | ||
| 22 | * Description: | ||
| 23 | * | 3 | * |
| 24 | * Rev: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 25 | * | ||
| 26 | * Modified: | ||
| 27 | * | ||
| 28 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 29 | * | ||
| 30 | * This program is free software; you can redistribute it and/or modify | ||
| 31 | * it under the terms of the GNU General Public License as published by | ||
| 32 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 33 | * any later version. | ||
| 34 | * | ||
| 35 | * This program is distributed in the hope that it will be useful, | ||
| 36 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 37 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 38 | * GNU General Public License for more details. | ||
| 39 | * | ||
| 40 | * You should have received a copy of the GNU General Public License | ||
| 41 | * along with this program; see the file COPYING. | ||
| 42 | * If not, write to the Free Software Foundation, | ||
| 43 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 44 | */ | 5 | */ |
| 6 | |||
| 45 | /* SYSTEM & MM REGISTER BIT & ADDRESS DEFINITIONS FOR ADSP-BF538/9 */ | 7 | /* SYSTEM & MM REGISTER BIT & ADDRESS DEFINITIONS FOR ADSP-BF538/9 */ |
| 46 | 8 | ||
| 47 | #ifndef _DEF_BF539_H | 9 | #ifndef _DEF_BF539_H |
diff --git a/arch/blackfin/mach-bf538/include/mach/gpio.h b/arch/blackfin/mach-bf538/include/mach/gpio.h index 30f4f723f7cc..295c78a465c2 100644 --- a/arch/blackfin/mach-bf538/include/mach/gpio.h +++ b/arch/blackfin/mach-bf538/include/mach/gpio.h | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf538/include/mach/gpio.h | ||
| 3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 4 | * | ||
| 5 | * Copyright (C) 2008 Analog Devices Inc. | 2 | * Copyright (C) 2008 Analog Devices Inc. |
| 6 | * Licensed under the GPL-2 or later. | 3 | * Licensed under the GPL-2 or later. |
| 7 | */ | 4 | */ |
diff --git a/arch/blackfin/mach-bf538/include/mach/irq.h b/arch/blackfin/mach-bf538/include/mach/irq.h index fdc87fe2c174..a4b7fcbc556b 100644 --- a/arch/blackfin/mach-bf538/include/mach/irq.h +++ b/arch/blackfin/mach-bf538/include/mach/irq.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf538/irq.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * based on: include/asm-blackfin/mach-bf537/irq.h | ||
| 4 | * author: Michael Hennerich (michael.hennerich@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * description: | ||
| 8 | * system mmr register map | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _BF538_IRQ_H_ | 7 | #ifndef _BF538_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf538/include/mach/portmux.h b/arch/blackfin/mach-bf538/include/mach/portmux.h index c8db264e3e4d..6121cf8b5872 100644 --- a/arch/blackfin/mach-bf538/include/mach/portmux.h +++ b/arch/blackfin/mach-bf538/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf538/ints-priority.c b/arch/blackfin/mach-bf538/ints-priority.c index 70d17e550e05..1fa793ced347 100644 --- a/arch/blackfin/mach-bf538/ints-priority.c +++ b/arch/blackfin/mach-bf538/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf538/ints-priority.c | 2 | * Set up the interrupt priorities |
| 3 | * Based on: arch/blackfin/mach-bf533/ints-priority.c | ||
| 4 | * Author: Michael Hennerich | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2008 Analog Devices Inc. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf548/boards/cm_bf548.c b/arch/blackfin/mach-bf548/boards/cm_bf548.c index e565aae11d72..ccdcd6da2e9f 100644 --- a/arch/blackfin/mach-bf548/boards/cm_bf548.c +++ b/arch/blackfin/mach-bf548/boards/cm_bf548.c | |||
| @@ -1,31 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf548/boards/cm_bf548.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf537/boards/ezkit.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 8 | */ |
| 30 | 9 | ||
| 31 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -380,19 +359,6 @@ static struct platform_device musb_device = { | |||
| 380 | }; | 359 | }; |
| 381 | #endif | 360 | #endif |
| 382 | 361 | ||
| 383 | static struct resource bfin_gpios_resources = { | ||
| 384 | .start = 0, | ||
| 385 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 386 | .flags = IORESOURCE_IRQ, | ||
| 387 | }; | ||
| 388 | |||
| 389 | static struct platform_device bfin_gpios_device = { | ||
| 390 | .name = "simple-gpio", | ||
| 391 | .id = -1, | ||
| 392 | .num_resources = 1, | ||
| 393 | .resource = &bfin_gpios_resources, | ||
| 394 | }; | ||
| 395 | |||
| 396 | #if defined(CONFIG_PATA_BF54X) || defined(CONFIG_PATA_BF54X_MODULE) | 362 | #if defined(CONFIG_PATA_BF54X) || defined(CONFIG_PATA_BF54X_MODULE) |
| 397 | static struct resource bfin_atapi_resources[] = { | 363 | static struct resource bfin_atapi_resources[] = { |
| 398 | { | 364 | { |
| @@ -546,13 +512,11 @@ static struct flash_platform_data bfin_spi_flash_data = { | |||
| 546 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | 512 | static struct bfin5xx_spi_chip spi_flash_chip_info = { |
| 547 | .enable_dma = 0, /* use dma transfer with this chip*/ | 513 | .enable_dma = 0, /* use dma transfer with this chip*/ |
| 548 | .bits_per_word = 8, | 514 | .bits_per_word = 8, |
| 549 | .cs_change_per_word = 0, | ||
| 550 | }; | 515 | }; |
| 551 | #endif | 516 | #endif |
| 552 | 517 | ||
| 553 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 518 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
| 554 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { | 519 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { |
| 555 | .cs_change_per_word = 0, | ||
| 556 | .enable_dma = 0, | 520 | .enable_dma = 0, |
| 557 | .bits_per_word = 16, | 521 | .bits_per_word = 16, |
| 558 | }; | 522 | }; |
| @@ -853,8 +817,6 @@ static struct platform_device *cm_bf548_devices[] __initdata = { | |||
| 853 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 817 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 854 | ¶_flash_device, | 818 | ¶_flash_device, |
| 855 | #endif | 819 | #endif |
| 856 | |||
| 857 | &bfin_gpios_device, | ||
| 858 | }; | 820 | }; |
| 859 | 821 | ||
| 860 | static int __init cm_bf548_init(void) | 822 | static int __init cm_bf548_init(void) |
diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c index c66f3801274f..1a5286bbb3fa 100644 --- a/arch/blackfin/mach-bf548/boards/ezkit.c +++ b/arch/blackfin/mach-bf548/boards/ezkit.c | |||
| @@ -1,31 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf548/boards/ezkit.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf537/boards/ezkit.c | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2005 National ICT Australia (NICTA) | ||
| 11 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 7 | */ |
| 30 | 8 | ||
| 31 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -208,7 +186,6 @@ static struct platform_device bfin_rotary_device = { | |||
| 208 | #endif | 186 | #endif |
| 209 | 187 | ||
| 210 | #if defined(CONFIG_INPUT_ADXL34X) || defined(CONFIG_INPUT_ADXL34X_MODULE) | 188 | #if defined(CONFIG_INPUT_ADXL34X) || defined(CONFIG_INPUT_ADXL34X_MODULE) |
| 211 | #include <linux/input.h> | ||
| 212 | #include <linux/spi/adxl34x.h> | 189 | #include <linux/spi/adxl34x.h> |
| 213 | static const struct adxl34x_platform_data adxl34x_info = { | 190 | static const struct adxl34x_platform_data adxl34x_info = { |
| 214 | .x_axis_offset = 0, | 191 | .x_axis_offset = 0, |
| @@ -636,7 +613,6 @@ static struct flash_platform_data bfin_spi_flash_data = { | |||
| 636 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | 613 | static struct bfin5xx_spi_chip spi_flash_chip_info = { |
| 637 | .enable_dma = 0, /* use dma transfer with this chip*/ | 614 | .enable_dma = 0, /* use dma transfer with this chip*/ |
| 638 | .bits_per_word = 8, | 615 | .bits_per_word = 8, |
| 639 | .cs_change_per_word = 0, | ||
| 640 | }; | 616 | }; |
| 641 | #endif | 617 | #endif |
| 642 | 618 | ||
| @@ -650,7 +626,6 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = { | |||
| 650 | 626 | ||
| 651 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 627 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
| 652 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { | 628 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { |
| 653 | .cs_change_per_word = 0, | ||
| 654 | .enable_dma = 0, | 629 | .enable_dma = 0, |
| 655 | .bits_per_word = 16, | 630 | .bits_per_word = 16, |
| 656 | }; | 631 | }; |
| @@ -681,7 +656,6 @@ static struct bfin5xx_spi_chip spidev_chip_info = { | |||
| 681 | static struct bfin5xx_spi_chip spi_adxl34x_chip_info = { | 656 | static struct bfin5xx_spi_chip spi_adxl34x_chip_info = { |
| 682 | .enable_dma = 0, /* use dma transfer with this chip*/ | 657 | .enable_dma = 0, /* use dma transfer with this chip*/ |
| 683 | .bits_per_word = 8, | 658 | .bits_per_word = 8, |
| 684 | .cs_change_per_word = 0, | ||
| 685 | }; | 659 | }; |
| 686 | #endif | 660 | #endif |
| 687 | 661 | ||
| @@ -908,19 +882,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 908 | }; | 882 | }; |
| 909 | #endif | 883 | #endif |
| 910 | 884 | ||
| 911 | static struct resource bfin_gpios_resources = { | ||
| 912 | .start = 0, | ||
| 913 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 914 | .flags = IORESOURCE_IRQ, | ||
| 915 | }; | ||
| 916 | |||
| 917 | static struct platform_device bfin_gpios_device = { | ||
| 918 | .name = "simple-gpio", | ||
| 919 | .id = -1, | ||
| 920 | .num_resources = 1, | ||
| 921 | .resource = &bfin_gpios_resources, | ||
| 922 | }; | ||
| 923 | |||
| 924 | static const unsigned int cclk_vlev_datasheet[] = | 885 | static const unsigned int cclk_vlev_datasheet[] = |
| 925 | { | 886 | { |
| 926 | /* | 887 | /* |
| @@ -1028,8 +989,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
| 1028 | &bfin_device_gpiokeys, | 989 | &bfin_device_gpiokeys, |
| 1029 | #endif | 990 | #endif |
| 1030 | 991 | ||
| 1031 | &bfin_gpios_device, | ||
| 1032 | |||
| 1033 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 992 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 1034 | &ezkit_flash_device, | 993 | &ezkit_flash_device, |
| 1035 | #endif | 994 | #endif |
diff --git a/arch/blackfin/mach-bf548/dma.c b/arch/blackfin/mach-bf548/dma.c index d9239bc05dd4..039a6d9d38f3 100644 --- a/arch/blackfin/mach-bf548/dma.c +++ b/arch/blackfin/mach-bf548/dma.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf548/dma.c | 2 | * the simple DMA Implementation for Blackfin |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf548/include/mach/bf548.h b/arch/blackfin/mach-bf548/include/mach/bf548.h index cd31f72bdd82..7bead5ce0f3b 100644 --- a/arch/blackfin/mach-bf548/include/mach/bf548.h +++ b/arch/blackfin/mach-bf548/include/mach/bf548.h | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/bf548.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: System MMR register and memory map for ADSP-BF548 | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #ifndef __MACH_BF548_H__ | 7 | #ifndef __MACH_BF548_H__ |
diff --git a/arch/blackfin/mach-bf548/include/mach/bf54x-lq043.h b/arch/blackfin/mach-bf548/include/mach/bf54x-lq043.h index 9c7ca62a45eb..8821efe57fbc 100644 --- a/arch/blackfin/mach-bf548/include/mach/bf54x-lq043.h +++ b/arch/blackfin/mach-bf548/include/mach/bf54x-lq043.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef BF54X_LQ043_H | 7 | #ifndef BF54X_LQ043_H |
| 2 | #define BF54X_LQ043_H | 8 | #define BF54X_LQ043_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf548/include/mach/bf54x_keys.h b/arch/blackfin/mach-bf548/include/mach/bf54x_keys.h index 1fb4ec77cc25..49338ae299ab 100644 --- a/arch/blackfin/mach-bf548/include/mach/bf54x_keys.h +++ b/arch/blackfin/mach-bf548/include/mach/bf54x_keys.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _BFIN_KPAD_H | 7 | #ifndef _BFIN_KPAD_H |
| 2 | #define _BFIN_KPAD_H | 8 | #define _BFIN_KPAD_H |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h index 2d1b5fa3cca0..dd44aa75fe72 100644 --- a/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf548/bfin_serial_5xx.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * description: | ||
| 8 | * blackfin serial driver head file | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf548/include/mach/blackfin.h b/arch/blackfin/mach-bf548/include/mach/blackfin.h index 318667b2f036..13302b67857a 100644 --- a/arch/blackfin/mach-bf548/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf548/include/mach/blackfin.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/blackfin.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf548/include/mach/cdefBF542.h b/arch/blackfin/mach-bf548/include/mach/cdefBF542.h index 07aefb9ed79b..42f4a9469549 100644 --- a/arch/blackfin/mach-bf548/include/mach/cdefBF542.h +++ b/arch/blackfin/mach-bf548/include/mach/cdefBF542.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/cdefBF542.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF542_H | 7 | #ifndef _CDEF_BF542_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/cdefBF544.h b/arch/blackfin/mach-bf548/include/mach/cdefBF544.h index 431a69278991..2207799575ff 100644 --- a/arch/blackfin/mach-bf548/include/mach/cdefBF544.h +++ b/arch/blackfin/mach-bf548/include/mach/cdefBF544.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/cdefBF544.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF544_H | 7 | #ifndef _CDEF_BF544_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/cdefBF547.h b/arch/blackfin/mach-bf548/include/mach/cdefBF547.h index 93376e90dfc5..423421515134 100644 --- a/arch/blackfin/mach-bf548/include/mach/cdefBF547.h +++ b/arch/blackfin/mach-bf548/include/mach/cdefBF547.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/cdefBF547.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF548_H | 7 | #ifndef _CDEF_BF548_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/cdefBF548.h b/arch/blackfin/mach-bf548/include/mach/cdefBF548.h index 9cd74384136f..df84180410c4 100644 --- a/arch/blackfin/mach-bf548/include/mach/cdefBF548.h +++ b/arch/blackfin/mach-bf548/include/mach/cdefBF548.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/cdefBF548.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF548_H | 7 | #ifndef _CDEF_BF548_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/cdefBF549.h b/arch/blackfin/mach-bf548/include/mach/cdefBF549.h index ead360b69dea..34c84c7fb256 100644 --- a/arch/blackfin/mach-bf548/include/mach/cdefBF549.h +++ b/arch/blackfin/mach-bf548/include/mach/cdefBF549.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf549/cdefBF549.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF549_H | 7 | #ifndef _CDEF_BF549_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/cdefBF54x_base.h b/arch/blackfin/mach-bf548/include/mach/cdefBF54x_base.h index 6e636c418cb0..a2e9d9849eba 100644 --- a/arch/blackfin/mach-bf548/include/mach/cdefBF54x_base.h +++ b/arch/blackfin/mach-bf548/include/mach/cdefBF54x_base.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/cdefBF54x_base.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF54X_H | 7 | #ifndef _CDEF_BF54X_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF542.h b/arch/blackfin/mach-bf548/include/mach/defBF542.h index b1316541b8d6..d3bc6d1df547 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF542.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF542.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/defBF542.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF542_H | 7 | #ifndef _DEF_BF542_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF544.h b/arch/blackfin/mach-bf548/include/mach/defBF544.h index c2c785bdc5fc..dd414ae4ba4c 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF544.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF544.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/defBF544.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF544_H | 7 | #ifndef _DEF_BF544_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF547.h b/arch/blackfin/mach-bf548/include/mach/defBF547.h index 661f0d877bd1..5a9dbabe0a68 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF547.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF547.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/defBF547.h | 2 | * Copyright 2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF548_H | 7 | #ifndef _DEF_BF548_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF548.h b/arch/blackfin/mach-bf548/include/mach/defBF548.h index 85d4bade911d..82cd593f7391 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF548.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF548.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/defBF548.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF548_H | 7 | #ifndef _DEF_BF548_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF549.h b/arch/blackfin/mach-bf548/include/mach/defBF549.h index 096734541644..6fc6e39ab61b 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF549.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF549.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/defBF549.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF549_H | 7 | #ifndef _DEF_BF549_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/defBF54x_base.h b/arch/blackfin/mach-bf548/include/mach/defBF54x_base.h index e022e896cb18..8590c8c78336 100644 --- a/arch/blackfin/mach-bf548/include/mach/defBF54x_base.h +++ b/arch/blackfin/mach-bf548/include/mach/defBF54x_base.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/defBF54x_base.h | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _DEF_BF54X_H | 7 | #ifndef _DEF_BF54X_H |
diff --git a/arch/blackfin/mach-bf548/include/mach/gpio.h b/arch/blackfin/mach-bf548/include/mach/gpio.h index 3a2051709787..850e39d193e3 100644 --- a/arch/blackfin/mach-bf548/include/mach/gpio.h +++ b/arch/blackfin/mach-bf548/include/mach/gpio.h | |||
| @@ -1,34 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf548/gpio.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Based on: | 3 | * Licensed under the GPL-2 or later. |
| 4 | * Author: Michael Hennerich (hennerich@blackfin.uclinux.org) | ||
| 5 | * | ||
| 6 | * Created: | ||
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 4 | */ |
| 29 | 5 | ||
| 30 | |||
| 31 | |||
| 32 | #define GPIO_PA0 0 | 6 | #define GPIO_PA0 0 |
| 33 | #define GPIO_PA1 1 | 7 | #define GPIO_PA1 1 |
| 34 | #define GPIO_PA2 2 | 8 | #define GPIO_PA2 2 |
diff --git a/arch/blackfin/mach-bf548/include/mach/irq.h b/arch/blackfin/mach-bf548/include/mach/irq.h index f194625f6821..106db05684ae 100644 --- a/arch/blackfin/mach-bf548/include/mach/irq.h +++ b/arch/blackfin/mach-bf548/include/mach/irq.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf548/irq.h | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * based on: include/asm-blackfin/mach-bf537/irq.h | ||
| 4 | * author: Roy Huang (roy.huang@analog.com) | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * description: | ||
| 8 | * system mmr register map | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _BF548_IRQ_H_ | 7 | #ifndef _BF548_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf548/include/mach/portmux.h b/arch/blackfin/mach-bf548/include/mach/portmux.h index ce372ba0f046..89ad6a886362 100644 --- a/arch/blackfin/mach-bf548/include/mach/portmux.h +++ b/arch/blackfin/mach-bf548/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf548/ints-priority.c b/arch/blackfin/mach-bf548/ints-priority.c index 9dd0fa3ac4de..48dd3a4bc4a5 100644 --- a/arch/blackfin/mach-bf548/ints-priority.c +++ b/arch/blackfin/mach-bf548/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf537/ints-priority.c | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/ints-priority.c | ||
| 4 | * Author: Michael Hennerich | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Set up the interrupt priorities |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf561/atomic.S b/arch/blackfin/mach-bf561/atomic.S index 9439bc6bd01f..0261a5e751b3 100644 --- a/arch/blackfin/mach-bf561/atomic.S +++ b/arch/blackfin/mach-bf561/atomic.S | |||
| @@ -1,23 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/atomic.S | 2 | * Copyright 2007-2008 Analog Devices Inc. |
| 3 | * Author: Philippe Gerum <rpm@xenomai.org> | 3 | * Philippe Gerum <rpm@xenomai.org> |
| 4 | * | 4 | * |
| 5 | * Copyright 2007 Analog Devices Inc. | 5 | * Licensed under the GPL-2 or later. |
| 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; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, see the file COPYING, or write | ||
| 19 | * to the Free Software Foundation, Inc., | ||
| 20 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 21 | */ | 6 | */ |
| 22 | 7 | ||
| 23 | #include <linux/linkage.h> | 8 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 6577ecfcf11e..dfc8d5b77986 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
| @@ -1,30 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf533/boards/cm_bf561.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: arch/blackfin/mach-bf533/boards/ezkit.c | 3 | * 2008-2009 Bluetechnix |
| 4 | * Author: Aidan Williams <aidan@nicta.com.au> Copyright 2005 | 4 | * 2005 National ICT Australia (NICTA) |
| 5 | * Aidan Williams <aidan@nicta.com.au> | ||
| 5 | * | 6 | * |
| 6 | * Created: 2006 | 7 | * Licensed under the GPL-2 or later. |
| 7 | * Description: Board description file | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 8 | */ |
| 29 | 9 | ||
| 30 | #include <linux/device.h> | 10 | #include <linux/device.h> |
| @@ -285,19 +265,6 @@ static struct platform_device net2272_bfin_device = { | |||
| 285 | }; | 265 | }; |
| 286 | #endif | 266 | #endif |
| 287 | 267 | ||
| 288 | static struct resource bfin_gpios_resources = { | ||
| 289 | .start = 0, | ||
| 290 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 291 | .flags = IORESOURCE_IRQ, | ||
| 292 | }; | ||
| 293 | |||
| 294 | static struct platform_device bfin_gpios_device = { | ||
| 295 | .name = "simple-gpio", | ||
| 296 | .id = -1, | ||
| 297 | .num_resources = 1, | ||
| 298 | .resource = &bfin_gpios_resources, | ||
| 299 | }; | ||
| 300 | |||
| 301 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 268 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
| 302 | static struct resource isp1362_hcd_resources[] = { | 269 | static struct resource isp1362_hcd_resources[] = { |
| 303 | { | 270 | { |
| @@ -532,8 +499,6 @@ static struct platform_device *cm_bf561_devices[] __initdata = { | |||
| 532 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 499 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 533 | ¶_flash_device, | 500 | ¶_flash_device, |
| 534 | #endif | 501 | #endif |
| 535 | |||
| 536 | &bfin_gpios_device, | ||
| 537 | }; | 502 | }; |
| 538 | 503 | ||
| 539 | static int __init cm_bf561_init(void) | 504 | static int __init cm_bf561_init(void) |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index caed96bb957e..9e2d8cfba546 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/ezkit.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | 3 | * 2005 National ICT Australia (NICTA) |
| 4 | * Author: | 4 | * Aidan Williams <aidan@nicta.com.au> |
| 5 | * | 5 | * |
| 6 | * Created: | 6 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| @@ -387,19 +366,6 @@ static struct platform_device bfin_device_gpiokeys = { | |||
| 387 | }; | 366 | }; |
| 388 | #endif | 367 | #endif |
| 389 | 368 | ||
| 390 | static struct resource bfin_gpios_resources = { | ||
| 391 | .start = 0, | ||
| 392 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
| 393 | .flags = IORESOURCE_IRQ, | ||
| 394 | }; | ||
| 395 | |||
| 396 | static struct platform_device bfin_gpios_device = { | ||
| 397 | .name = "simple-gpio", | ||
| 398 | .id = -1, | ||
| 399 | .num_resources = 1, | ||
| 400 | .resource = &bfin_gpios_resources, | ||
| 401 | }; | ||
| 402 | |||
| 403 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 369 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
| 404 | #include <linux/i2c-gpio.h> | 370 | #include <linux/i2c-gpio.h> |
| 405 | 371 | ||
| @@ -493,8 +459,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
| 493 | &isp1362_hcd_device, | 459 | &isp1362_hcd_device, |
| 494 | #endif | 460 | #endif |
| 495 | 461 | ||
| 496 | &bfin_gpios_device, | ||
| 497 | |||
| 498 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 462 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
| 499 | &ezkit_flash_device, | 463 | &ezkit_flash_device, |
| 500 | #endif | 464 | #endif |
diff --git a/arch/blackfin/mach-bf561/boards/tepla.c b/arch/blackfin/mach-bf561/boards/tepla.c index 6f77dbe952f5..8ba7252455e1 100644 --- a/arch/blackfin/mach-bf561/boards/tepla.c +++ b/arch/blackfin/mach-bf561/boards/tepla.c | |||
| @@ -1,15 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/tepla.c | 2 | * Copyright 2004-2007 Analog Devices Inc. |
| 3 | * 2005 National ICT Australia (NICTA) | ||
| 4 | * Aidan Williams <aidan@nicta.com.au> | ||
| 3 | * | 5 | * |
| 4 | * Copyright 2004-2007 Analog Devices Inc. | 6 | * Thanks to Jamey Hicks. |
| 5 | * Only SMSC91C1111 was registered, may do more later. | ||
| 6 | * | 7 | * |
| 7 | * Copyright 2005 National ICT Australia (NICTA), Aidan Williams <aidan@nicta.com.au> | 8 | * Only SMSC91C1111 was registered, may do more later. |
| 8 | * Thanks to Jamey Hicks. | ||
| 9 | * | 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 10 | * Licensed under the GPL-2 |
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | 11 | */ |
| 14 | 12 | ||
| 15 | #include <linux/device.h> | 13 | #include <linux/device.h> |
diff --git a/arch/blackfin/mach-bf561/dma.c b/arch/blackfin/mach-bf561/dma.c index 42b0037afe61..c938c3c7355d 100644 --- a/arch/blackfin/mach-bf561/dma.c +++ b/arch/blackfin/mach-bf561/dma.c | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/dma.c | 2 | * the simple DMA Implementation for Blackfin |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2007-2008 Analog Devices Inc. |
| 7 | * Description: This file contains the simple DMA Implementation for Blackfin | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 8 | |||
| 29 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-bf561/include/mach/bf561.h b/arch/blackfin/mach-bf561/include/mach/bf561.h index 9968362a2ee4..9f9a367e6a24 100644 --- a/arch/blackfin/mach-bf561/include/mach/bf561.h +++ b/arch/blackfin/mach-bf561/include/mach/bf561.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf561/bf561.h | 2 | * SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2005-2008 Analog Devices Inc. |
| 7 | * Description: SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef __MACH_BF561_H__ | 9 | #ifndef __MACH_BF561_H__ |
diff --git a/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h index fd5e8878b8c4..e33e158bc16d 100644 --- a/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file: include/asm-blackfin/mach-bf561/bfin_serial_5xx.h | 2 | * Copyright 2006-2009 Analog Devices Inc. |
| 3 | * based on: | ||
| 4 | * author: | ||
| 5 | * | 3 | * |
| 6 | * created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * description: | ||
| 8 | * blackfin serial driver head file | ||
| 9 | * rev: | ||
| 10 | * | ||
| 11 | * modified: | ||
| 12 | * | ||
| 13 | * | ||
| 14 | * bugs: enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * this program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the gnu general public license as published by | ||
| 18 | * the free software foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * this program is distributed in the hope that it will be useful, | ||
| 22 | * but without any warranty; without even the implied warranty of | ||
| 23 | * merchantability or fitness for a particular purpose. see the | ||
| 24 | * gnu general public license for more details. | ||
| 25 | * | ||
| 26 | * you should have received a copy of the gnu general public license | ||
| 27 | * along with this program; see the file copying. | ||
| 28 | * if not, write to the free software foundation, | ||
| 29 | * 59 temple place - suite 330, boston, ma 02111-1307, usa. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #include <linux/serial.h> | 7 | #include <linux/serial.h> |
diff --git a/arch/blackfin/mach-bf561/include/mach/blackfin.h b/arch/blackfin/mach-bf561/include/mach/blackfin.h index 8be31358ef88..67d6bdcd3fa8 100644 --- a/arch/blackfin/mach-bf561/include/mach/blackfin.h +++ b/arch/blackfin/mach-bf561/include/mach/blackfin.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf561/blackfin.h | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _MACH_BLACKFIN_H_ | 7 | #ifndef _MACH_BLACKFIN_H_ |
diff --git a/arch/blackfin/mach-bf561/include/mach/cdefBF561.h b/arch/blackfin/mach-bf561/include/mach/cdefBF561.h index 9d9858c2be68..81ecdb71c6af 100644 --- a/arch/blackfin/mach-bf561/include/mach/cdefBF561.h +++ b/arch/blackfin/mach-bf561/include/mach/cdefBF561.h | |||
| @@ -1,31 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: include/asm-blackfin/mach-bf561/cdefBF561.h | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: C POINTERS TO SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 | ||
| 8 | * | ||
| 9 | * Rev: | ||
| 10 | * | ||
| 11 | * Modified: | ||
| 12 | * | ||
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 18 | * any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; see the file COPYING. | ||
| 27 | * If not, write to the Free Software Foundation, | ||
| 28 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 29 | */ | 5 | */ |
| 30 | 6 | ||
| 31 | #ifndef _CDEF_BF561_H | 7 | #ifndef _CDEF_BF561_H |
diff --git a/arch/blackfin/mach-bf561/include/mach/defBF561.h b/arch/blackfin/mach-bf561/include/mach/defBF561.h index 5fc0f05026e0..a31e509553fb 100644 --- a/arch/blackfin/mach-bf561/include/mach/defBF561.h +++ b/arch/blackfin/mach-bf561/include/mach/defBF561.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | |||
| 2 | /* | 1 | /* |
| 3 | * File: include/asm-blackfin/mach-bf561/defBF561.h | 2 | * Copyright 2005-2009 Analog Devices Inc. |
| 4 | * Based on: | ||
| 5 | * Author: | ||
| 6 | * | ||
| 7 | * Created: | ||
| 8 | * Description: | ||
| 9 | * SYSTEM MMR REGISTER AND MEMORY MAP FOR ADSP-BF561 | ||
| 10 | * Rev: | ||
| 11 | * | ||
| 12 | * Modified: | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | 3 | * |
| 26 | * You should have received a copy of the GNU General Public License | 4 | * Licensed under the ADI BSD license or the GPL-2 (or later) |
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _DEF_BF561_H | 7 | #ifndef _DEF_BF561_H |
diff --git a/arch/blackfin/mach-bf561/include/mach/gpio.h b/arch/blackfin/mach-bf561/include/mach/gpio.h index 7882f79e1ade..a651a8cf805f 100644 --- a/arch/blackfin/mach-bf561/include/mach/gpio.h +++ b/arch/blackfin/mach-bf561/include/mach/gpio.h | |||
| @@ -1,7 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/include/mach/gpio.h | ||
| 3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 4 | * | ||
| 5 | * Copyright (C) 2008 Analog Devices Inc. | 2 | * Copyright (C) 2008 Analog Devices Inc. |
| 6 | * Licensed under the GPL-2 or later. | 3 | * Licensed under the GPL-2 or later. |
| 7 | */ | 4 | */ |
diff --git a/arch/blackfin/mach-bf561/include/mach/irq.h b/arch/blackfin/mach-bf561/include/mach/irq.h index 6698389c5564..7b208db267bf 100644 --- a/arch/blackfin/mach-bf561/include/mach/irq.h +++ b/arch/blackfin/mach-bf561/include/mach/irq.h | |||
| @@ -1,32 +1,7 @@ | |||
| 1 | |||
| 2 | /* | 1 | /* |
| 3 | * File: include/asm-blackfin/mach-bf561/irq.h | 2 | * Copyright 2005-2008 Analog Devices Inc. |
| 4 | * Based on: | ||
| 5 | * Author: | ||
| 6 | * | ||
| 7 | * Created: | ||
| 8 | * Description: | ||
| 9 | * | ||
| 10 | * Rev: | ||
| 11 | * | ||
| 12 | * Modified: | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2, or (at your option) | ||
| 19 | * any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | 3 | * |
| 26 | * You should have received a copy of the GNU General Public License | 4 | * Licensed under the GPL-2 or later. |
| 27 | * along with this program; see the file COPYING. | ||
| 28 | * If not, write to the Free Software Foundation, | ||
| 29 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 30 | */ | 5 | */ |
| 31 | 6 | ||
| 32 | #ifndef _BF561_IRQ_H_ | 7 | #ifndef _BF561_IRQ_H_ |
diff --git a/arch/blackfin/mach-bf561/include/mach/portmux.h b/arch/blackfin/mach-bf561/include/mach/portmux.h index 2e5ad6347dea..3a7b46bbe849 100644 --- a/arch/blackfin/mach-bf561/include/mach/portmux.h +++ b/arch/blackfin/mach-bf561/include/mach/portmux.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2009 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_PORTMUX_H_ | 7 | #ifndef _MACH_PORTMUX_H_ |
| 2 | #define _MACH_PORTMUX_H_ | 8 | #define _MACH_PORTMUX_H_ |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf561/include/mach/smp.h b/arch/blackfin/mach-bf561/include/mach/smp.h index f9e65ebe81b2..390c7f4ae7b3 100644 --- a/arch/blackfin/mach-bf561/include/mach/smp.h +++ b/arch/blackfin/mach-bf561/include/mach/smp.h | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2007-2008 Analog Devices Inc. | ||
| 3 | * | ||
| 4 | * Licensed under the GPL-2 or later. | ||
| 5 | */ | ||
| 6 | |||
| 1 | #ifndef _MACH_BF561_SMP | 7 | #ifndef _MACH_BF561_SMP |
| 2 | #define _MACH_BF561_SMP | 8 | #define _MACH_BF561_SMP |
| 3 | 9 | ||
diff --git a/arch/blackfin/mach-bf561/ints-priority.c b/arch/blackfin/mach-bf561/ints-priority.c index 9d2f23344720..b4424172ad9e 100644 --- a/arch/blackfin/mach-bf561/ints-priority.c +++ b/arch/blackfin/mach-bf561/ints-priority.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/ints-priority.c | 2 | * Set up the interrupt priorities |
| 3 | * Based on: arch/blackfin/mach-bf537/ints-priority.c | ||
| 4 | * Author: Michael Hennerich | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2005-2009 Analog Devices Inc. |
| 7 | * Description: Set up the interrupt priorities | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-bf561/secondary.S b/arch/blackfin/mach-bf561/secondary.S index f72a6af20c4f..8e6050369c06 100644 --- a/arch/blackfin/mach-bf561/secondary.S +++ b/arch/blackfin/mach-bf561/secondary.S | |||
| @@ -1,26 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/secondary.S | 2 | * BF561 coreB bootstrap file |
| 3 | * Based on: arch/blackfin/mach-bf561/head.S | ||
| 4 | * Author: Philippe Gerum <rpm@xenomai.org> | ||
| 5 | * | 3 | * |
| 6 | * Copyright 2007 Analog Devices Inc. | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 5 | * Philippe Gerum <rpm@xenomai.org> | ||
| 7 | * | 6 | * |
| 8 | * Description: BF561 coreB bootstrap file | 7 | * Licensed under the GPL-2 or later. |
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or | ||
| 13 | * (at your option) any later version. | ||
| 14 | * | ||
| 15 | * This program is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | * GNU General Public License for more details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU General Public License | ||
| 21 | * along with this program; if not, see the file COPYING, or write | ||
| 22 | * to the Free Software Foundation, Inc., | ||
| 23 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 24 | */ | 8 | */ |
| 25 | 9 | ||
| 26 | #include <linux/linkage.h> | 10 | #include <linux/linkage.h> |
diff --git a/arch/blackfin/mach-bf561/smp.c b/arch/blackfin/mach-bf561/smp.c index 8c10701c251f..510f57641495 100644 --- a/arch/blackfin/mach-bf561/smp.c +++ b/arch/blackfin/mach-bf561/smp.c | |||
| @@ -1,23 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-bf561/smp.c | 2 | * Copyright 2007-2009 Analog Devices Inc. |
| 3 | * Author: Philippe Gerum <rpm@xenomai.org> | 3 | * Philippe Gerum <rpm@xenomai.org> |
| 4 | * | 4 | * |
| 5 | * Copyright 2007 Analog Devices Inc. | 5 | * Licensed under the GPL-2 or later. |
| 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; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, see the file COPYING, or write | ||
| 19 | * to the Free Software Foundation, Inc., | ||
| 20 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 21 | */ | 6 | */ |
| 22 | 7 | ||
| 23 | #include <linux/init.h> | 8 | #include <linux/init.h> |
diff --git a/arch/blackfin/mach-common/arch_checks.c b/arch/blackfin/mach-common/arch_checks.c index 5998d8632a73..9dbafcdcf479 100644 --- a/arch/blackfin/mach-common/arch_checks.c +++ b/arch/blackfin/mach-common/arch_checks.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/arch_checks.c | 2 | * Do some checking to make sure things are OK |
| 3 | * Based on: | ||
| 4 | * Author: Robin Getz <rgetz@blackfin.uclinux.org> | ||
| 5 | * | 3 | * |
| 6 | * Created: 25Jul07 | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 7 | * Description: Do some checking to make sure things are OK | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <asm/fixed_code.h> | 9 | #include <asm/fixed_code.h> |
diff --git a/arch/blackfin/mach-common/cache-c.c b/arch/blackfin/mach-common/cache-c.c index 4ebbd78db3a4..a60a24f5035d 100644 --- a/arch/blackfin/mach-common/cache-c.c +++ b/arch/blackfin/mach-common/cache-c.c | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2009 Analog Devices Inc. | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 9 | */ | 7 | */ |
| 10 | 8 | ||
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index d9666fe6c3d6..ea540318a228 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2008 Analog Devices Inc. | 4 | * Copyright 2004-2008 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 9 | */ | 7 | */ |
| 10 | 8 | ||
diff --git a/arch/blackfin/mach-common/cpufreq.c b/arch/blackfin/mach-common/cpufreq.c index 85c658083279..01506504e6d0 100644 --- a/arch/blackfin/mach-common/cpufreq.c +++ b/arch/blackfin/mach-common/cpufreq.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/cpufreq.c | 2 | * Blackfin core clock scaling |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2008-2009 Analog Devices Inc. |
| 7 | * Description: Blackfin core clock scaling | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index 1e7cac23e25f..94a0375cbdcf 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
| @@ -1,32 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/entry.S | 2 | * Contains the system-call and fault low-level handling routines. |
| 3 | * Based on: | 3 | * This also contains the timer-interrupt handler, as well as all |
| 4 | * Author: Linus Torvalds | 4 | * interrupts and faults that can result in a task-switch. |
| 5 | * | 5 | * |
| 6 | * Created: ? | 6 | * Copyright 2005-2009 Analog Devices Inc. |
| 7 | * Description: contains the system-call and fault low-level handling routines. | ||
| 8 | * This also contains the timer-interrupt handler, as well as all | ||
| 9 | * interrupts and faults that can result in a task-switch. | ||
| 10 | * | 7 | * |
| 11 | * Modified: | 8 | * Licensed under the GPL-2 or later. |
| 12 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 13 | * | ||
| 14 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 15 | * | ||
| 16 | * This program is free software; you can redistribute it and/or modify | ||
| 17 | * it under the terms of the GNU General Public License as published by | ||
| 18 | * the Free Software Foundation; either version 2 of the License, or | ||
| 19 | * (at your option) any later version. | ||
| 20 | * | ||
| 21 | * This program is distributed in the hope that it will be useful, | ||
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 24 | * GNU General Public License for more details. | ||
| 25 | * | ||
| 26 | * You should have received a copy of the GNU General Public License | ||
| 27 | * along with this program; if not, see the file COPYING, or write | ||
| 28 | * to the Free Software Foundation, Inc., | ||
| 29 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 30 | */ | 9 | */ |
| 31 | 10 | ||
| 32 | /* NOTE: This code handles signal-recognition, which happens every time | 11 | /* NOTE: This code handles signal-recognition, which happens every time |
diff --git a/arch/blackfin/mach-common/head.S b/arch/blackfin/mach-common/head.S index 9c79dfea2a53..cab0a0031eee 100644 --- a/arch/blackfin/mach-common/head.S +++ b/arch/blackfin/mach-common/head.S | |||
| @@ -3,8 +3,6 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2008 Analog Devices Inc. | 4 | * Copyright 2004-2008 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 9 | */ | 7 | */ |
| 10 | 8 | ||
diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S index 82d417ef4b5b..8085ff1cce00 100644 --- a/arch/blackfin/mach-common/interrupt.S +++ b/arch/blackfin/mach-common/interrupt.S | |||
| @@ -1,31 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/interrupt.S | 2 | * Interrupt Entries |
| 3 | * Based on: | ||
| 4 | * Author: D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca> | ||
| 5 | * Kenneth Albanowski <kjahds@kjahds.com> | ||
| 6 | * | ||
| 7 | * Created: ? | ||
| 8 | * Description: Interrupt Entries | ||
| 9 | * | ||
| 10 | * Modified: | ||
| 11 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 12 | * | 3 | * |
| 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 4 | * Copyright 2005-2009 Analog Devices Inc. |
| 14 | * | 5 | * D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca> |
| 15 | * This program is free software; you can redistribute it and/or modify | 6 | * Kenneth Albanowski <kjahds@kjahds.com> |
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | 7 | * |
| 25 | * You should have received a copy of the GNU General Public License | 8 | * Licensed under the GPL-2 or later. |
| 26 | * along with this program; if not, see the file COPYING, or write | ||
| 27 | * to the Free Software Foundation, Inc., | ||
| 28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 29 | */ | 9 | */ |
| 30 | 10 | ||
| 31 | #include <asm/blackfin.h> | 11 | #include <asm/blackfin.h> |
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 6ffda78aaf9d..660ea1bec54c 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
| @@ -1,33 +1,14 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/ints-priority.c | 2 | * Set up the interrupt priorities |
| 3 | * | 3 | * |
| 4 | * Description: Set up the interrupt priorities | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 5 | * 2003 Bas Vermeulen <bas@buyways.nl> | ||
| 6 | * 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca> | ||
| 7 | * 2000-2001 Lineo, Inc. D. Jefff Dionne <jeff@lineo.ca> | ||
| 8 | * 1999 D. Jeff Dionne <jeff@uclinux.org> | ||
| 9 | * 1996 Roman Zippel | ||
| 5 | * | 10 | * |
| 6 | * Modified: | 11 | * Licensed under the GPL-2 |
| 7 | * 1996 Roman Zippel | ||
| 8 | * 1999 D. Jeff Dionne <jeff@uclinux.org> | ||
| 9 | * 2000-2001 Lineo, Inc. D. Jefff Dionne <jeff@lineo.ca> | ||
| 10 | * 2002 Arcturus Networks Inc. MaTed <mated@sympatico.ca> | ||
| 11 | * 2003 Metrowerks/Motorola | ||
| 12 | * 2003 Bas Vermeulen <bas@buyways.nl> | ||
| 13 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 14 | * | ||
| 15 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 16 | * | ||
| 17 | * This program is free software; you can redistribute it and/or modify | ||
| 18 | * it under the terms of the GNU General Public License as published by | ||
| 19 | * the Free Software Foundation; either version 2 of the License, or | ||
| 20 | * (at your option) any later version. | ||
| 21 | * | ||
| 22 | * This program is distributed in the hope that it will be useful, | ||
| 23 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 24 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 25 | * GNU General Public License for more details. | ||
| 26 | * | ||
| 27 | * You should have received a copy of the GNU General Public License | ||
| 28 | * along with this program; if not, see the file COPYING, or write | ||
| 29 | * to the Free Software Foundation, Inc., | ||
| 30 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 31 | */ | 12 | */ |
| 32 | 13 | ||
| 33 | #include <linux/module.h> | 14 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-common/irqpanic.c b/arch/blackfin/mach-common/irqpanic.c index 883e3241b17e..c6496249e2bc 100644 --- a/arch/blackfin/mach-common/irqpanic.c +++ b/arch/blackfin/mach-common/irqpanic.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/irqpanic.c | 2 | * panic kernel with dump information |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: ? | 4 | * Copyright 2005-2009 Analog Devices Inc. |
| 7 | * Description: panic kernel with dump information | ||
| 8 | * | 5 | * |
| 9 | * Modified: rgetz - added cache checking code 14Feb06 | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/blackfin/mach-common/pm.c b/arch/blackfin/mach-common/pm.c index 0e3d4ff9d8b6..8837be4edb4a 100644 --- a/arch/blackfin/mach-common/pm.c +++ b/arch/blackfin/mach-common/pm.c | |||
| @@ -1,35 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mach-common/pm.c | 2 | * Blackfin power management |
| 3 | * Based on: arm/mach-omap/pm.c | ||
| 4 | * Author: Cliff Brake <cbrake@accelent.com> Copyright (c) 2001 | ||
| 5 | * | 3 | * |
| 6 | * Created: 2001 | 4 | * Copyright 2006-2009 Analog Devices Inc. |
| 7 | * Description: Blackfin power management | ||
| 8 | * | 5 | * |
| 9 | * Modified: Nicolas Pitre - PXA250 support | 6 | * Licensed under the GPL-2 |
| 10 | * Copyright (c) 2002 Monta Vista Software, Inc. | 7 | * based on arm/mach-omap/pm.c |
| 11 | * David Singleton - OMAP1510 | 8 | * Copyright 2001, Cliff Brake <cbrake@accelent.com> and others |
| 12 | * Copyright (c) 2002 Monta Vista Software, Inc. | ||
| 13 | * Dirk Behme <dirk.behme@de.bosch.com> - OMAP1510/1610 | ||
| 14 | * Copyright 2004 | ||
| 15 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 16 | * | ||
| 17 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 18 | * | ||
| 19 | * This program is free software; you can redistribute it and/or modify | ||
| 20 | * it under the terms of the GNU General Public License as published by | ||
| 21 | * the Free Software Foundation; either version 2 of the License, or | ||
| 22 | * (at your option) any later version. | ||
| 23 | * | ||
| 24 | * This program is distributed in the hope that it will be useful, | ||
| 25 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 27 | * GNU General Public License for more details. | ||
| 28 | * | ||
| 29 | * You should have received a copy of the GNU General Public License | ||
| 30 | * along with this program; if not, see the file COPYING, or write | ||
| 31 | * to the Free Software Foundation, Inc., | ||
| 32 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 33 | */ | 9 | */ |
| 34 | 10 | ||
| 35 | #include <linux/suspend.h> | 11 | #include <linux/suspend.h> |
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index 349ee3f5466a..d98585f3237d 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c | |||
| @@ -1,24 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/kernel/smp.c | 2 | * IPI management based on arch/arm/kernel/smp.c (Copyright 2002 ARM Limited) |
| 3 | * Author: Philippe Gerum <rpm@xenomai.org> | ||
| 4 | * IPI management based on arch/arm/kernel/smp.c. | ||
| 5 | * | 3 | * |
| 6 | * Copyright 2007 Analog Devices Inc. | 4 | * Copyright 2007-2009 Analog Devices Inc. |
| 5 | * Philippe Gerum <rpm@xenomai.org> | ||
| 7 | * | 6 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 7 | * Licensed under the GPL-2. |
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, see the file COPYING, or write | ||
| 20 | * to the Free Software Foundation, Inc., | ||
| 21 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 22 | */ | 8 | */ |
| 23 | 9 | ||
| 24 | #include <linux/module.h> | 10 | #include <linux/module.h> |
diff --git a/arch/blackfin/mm/blackfin_sram.h b/arch/blackfin/mm/blackfin_sram.h index bc0062884fde..fb0b1599cfb7 100644 --- a/arch/blackfin/mm/blackfin_sram.h +++ b/arch/blackfin/mm/blackfin_sram.h | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mm/blackfin_sram.h | 2 | * Local prototypes meant for internal use only |
| 3 | * Based on: arch/blackfin/mm/blackfin_sram.c | ||
| 4 | * Author: Mike Frysinger | ||
| 5 | * | 3 | * |
| 6 | * Created: Aug 2006 | 4 | * Copyright 2006-2009 Analog Devices Inc. |
| 7 | * Description: Local prototypes meant for internal use only | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2006 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #ifndef __BLACKFIN_SRAM_H__ | 9 | #ifndef __BLACKFIN_SRAM_H__ |
diff --git a/arch/blackfin/mm/init.c b/arch/blackfin/mm/init.c index b88ce7fda548..bb9c98f9cb5b 100644 --- a/arch/blackfin/mm/init.c +++ b/arch/blackfin/mm/init.c | |||
| @@ -1,30 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mm/init.c | 2 | * Copyright 2004-2009 Analog Devices Inc. |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Licensed under the GPL-2 or later. |
| 7 | * Description: | ||
| 8 | * | ||
| 9 | * Modified: | ||
| 10 | * Copyright 2004-2007 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 5 | */ |
| 29 | 6 | ||
| 30 | #include <linux/swap.h> | 7 | #include <linux/swap.h> |
diff --git a/arch/blackfin/mm/isram-driver.c b/arch/blackfin/mm/isram-driver.c index beb1a608824c..84cdc5a1c139 100644 --- a/arch/blackfin/mm/isram-driver.c +++ b/arch/blackfin/mm/isram-driver.c | |||
| @@ -1,19 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Description: Instruction SRAM accessor functions for the Blackfin | 2 | * Instruction SRAM accessor functions for the Blackfin |
| 3 | * | 3 | * |
| 4 | * Copyright 2008 Analog Devices Inc. | 4 | * Copyright 2008 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 6 | * Licensed under the GPL-2 or later |
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program; if not, see the file COPYING, or write | ||
| 15 | * to the Free Software Foundation, Inc., | ||
| 16 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | */ | 7 | */ |
| 18 | 8 | ||
| 19 | #define pr_fmt(fmt) "isram: " fmt | 9 | #define pr_fmt(fmt) "isram: " fmt |
diff --git a/arch/blackfin/mm/sram-alloc.c b/arch/blackfin/mm/sram-alloc.c index eb63ab353e5a..f068c11ea98f 100644 --- a/arch/blackfin/mm/sram-alloc.c +++ b/arch/blackfin/mm/sram-alloc.c | |||
| @@ -1,30 +1,9 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * File: arch/blackfin/mm/sram-alloc.c | 2 | * SRAM allocator for Blackfin on-chip memory |
| 3 | * Based on: | ||
| 4 | * Author: | ||
| 5 | * | 3 | * |
| 6 | * Created: | 4 | * Copyright 2004-2009 Analog Devices Inc. |
| 7 | * Description: SRAM allocator for Blackfin L1 and L2 memory | ||
| 8 | * | 5 | * |
| 9 | * Modified: | 6 | * Licensed under the GPL-2 or later. |
| 10 | * Copyright 2004-2008 Analog Devices Inc. | ||
| 11 | * | ||
| 12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
| 13 | * | ||
| 14 | * This program is free software; you can redistribute it and/or modify | ||
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | * | ||
| 19 | * This program is distributed in the hope that it will be useful, | ||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 22 | * GNU General Public License for more details. | ||
| 23 | * | ||
| 24 | * You should have received a copy of the GNU General Public License | ||
| 25 | * along with this program; if not, see the file COPYING, or write | ||
| 26 | * to the Free Software Foundation, Inc., | ||
| 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 28 | */ | 7 | */ |
| 29 | 8 | ||
| 30 | #include <linux/module.h> | 9 | #include <linux/module.h> |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index f388dc68f605..524d9352f17e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
| @@ -18,6 +18,7 @@ config PARISC | |||
| 18 | select BUG | 18 | select BUG |
| 19 | select HAVE_PERF_EVENTS | 19 | select HAVE_PERF_EVENTS |
| 20 | select GENERIC_ATOMIC64 if !64BIT | 20 | select GENERIC_ATOMIC64 if !64BIT |
| 21 | select HAVE_ARCH_TRACEHOOK | ||
| 21 | help | 22 | help |
| 22 | The PA-RISC microprocessor is designed by Hewlett-Packard and used | 23 | The PA-RISC microprocessor is designed by Hewlett-Packard and used |
| 23 | in many of their workstations & servers (HP9000 700 and 800 series, | 24 | in many of their workstations & servers (HP9000 700 and 800 series, |
diff --git a/arch/parisc/include/asm/fixmap.h b/arch/parisc/include/asm/fixmap.h index de3fe3a18229..6fec4d4a1a18 100644 --- a/arch/parisc/include/asm/fixmap.h +++ b/arch/parisc/include/asm/fixmap.h | |||
| @@ -21,9 +21,9 @@ | |||
| 21 | #define KERNEL_MAP_END (TMPALIAS_MAP_START) | 21 | #define KERNEL_MAP_END (TMPALIAS_MAP_START) |
| 22 | 22 | ||
| 23 | #ifndef __ASSEMBLY__ | 23 | #ifndef __ASSEMBLY__ |
| 24 | extern void *vmalloc_start; | 24 | extern void *parisc_vmalloc_start; |
| 25 | #define PCXL_DMA_MAP_SIZE (8*1024*1024) | 25 | #define PCXL_DMA_MAP_SIZE (8*1024*1024) |
| 26 | #define VMALLOC_START ((unsigned long)vmalloc_start) | 26 | #define VMALLOC_START ((unsigned long)parisc_vmalloc_start) |
| 27 | #define VMALLOC_END (KERNEL_MAP_END) | 27 | #define VMALLOC_END (KERNEL_MAP_END) |
| 28 | #endif /*__ASSEMBLY__*/ | 28 | #endif /*__ASSEMBLY__*/ |
| 29 | 29 | ||
diff --git a/arch/parisc/include/asm/hardirq.h b/arch/parisc/include/asm/hardirq.h index ce93133d5112..0d68184a76cb 100644 --- a/arch/parisc/include/asm/hardirq.h +++ b/arch/parisc/include/asm/hardirq.h | |||
| @@ -1,29 +1,11 @@ | |||
| 1 | /* hardirq.h: PA-RISC hard IRQ support. | 1 | /* hardirq.h: PA-RISC hard IRQ support. |
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2001 Matthew Wilcox <matthew@wil.cx> | 3 | * Copyright (C) 2001 Matthew Wilcox <matthew@wil.cx> |
| 4 | * | ||
| 5 | * The locking is really quite interesting. There's a cpu-local | ||
| 6 | * count of how many interrupts are being handled, and a global | ||
| 7 | * lock. An interrupt can only be serviced if the global lock | ||
| 8 | * is free. You can't be sure no more interrupts are being | ||
| 9 | * serviced until you've acquired the lock and then checked | ||
| 10 | * all the per-cpu interrupt counts are all zero. It's a specialised | ||
| 11 | * br_lock, and that's exactly how Sparc does it. We don't because | ||
| 12 | * it's more locking for us. This way is lock-free in the interrupt path. | ||
| 13 | */ | 4 | */ |
| 14 | 5 | ||
| 15 | #ifndef _PARISC_HARDIRQ_H | 6 | #ifndef _PARISC_HARDIRQ_H |
| 16 | #define _PARISC_HARDIRQ_H | 7 | #define _PARISC_HARDIRQ_H |
| 17 | 8 | ||
| 18 | #include <linux/threads.h> | 9 | #include <asm-generic/hardirq.h> |
| 19 | #include <linux/irq.h> | ||
| 20 | |||
| 21 | typedef struct { | ||
| 22 | unsigned long __softirq_pending; /* set_bit is used on this */ | ||
| 23 | } ____cacheline_aligned irq_cpustat_t; | ||
| 24 | |||
| 25 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | ||
| 26 | |||
| 27 | void ack_bad_irq(unsigned int irq); | ||
| 28 | 10 | ||
| 29 | #endif /* _PARISC_HARDIRQ_H */ | 11 | #endif /* _PARISC_HARDIRQ_H */ |
diff --git a/arch/parisc/include/asm/ptrace.h b/arch/parisc/include/asm/ptrace.h index 302f68dc889c..aead40b16dd8 100644 --- a/arch/parisc/include/asm/ptrace.h +++ b/arch/parisc/include/asm/ptrace.h | |||
| @@ -59,8 +59,11 @@ void user_enable_block_step(struct task_struct *task); | |||
| 59 | #define user_mode(regs) (((regs)->iaoq[0] & 3) ? 1 : 0) | 59 | #define user_mode(regs) (((regs)->iaoq[0] & 3) ? 1 : 0) |
| 60 | #define user_space(regs) (((regs)->iasq[1] != 0) ? 1 : 0) | 60 | #define user_space(regs) (((regs)->iasq[1] != 0) ? 1 : 0) |
| 61 | #define instruction_pointer(regs) ((regs)->iaoq[0] & ~3) | 61 | #define instruction_pointer(regs) ((regs)->iaoq[0] & ~3) |
| 62 | #define user_stack_pointer(regs) ((regs)->gr[30]) | ||
| 62 | unsigned long profile_pc(struct pt_regs *); | 63 | unsigned long profile_pc(struct pt_regs *); |
| 63 | extern void show_regs(struct pt_regs *); | 64 | extern void show_regs(struct pt_regs *); |
| 64 | #endif | 65 | |
| 66 | |||
| 67 | #endif /* __KERNEL__ */ | ||
| 65 | 68 | ||
| 66 | #endif | 69 | #endif |
diff --git a/arch/parisc/include/asm/syscall.h b/arch/parisc/include/asm/syscall.h new file mode 100644 index 000000000000..8bdfd2c8c39f --- /dev/null +++ b/arch/parisc/include/asm/syscall.h | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | /* syscall.h */ | ||
| 2 | |||
| 3 | #ifndef _ASM_PARISC_SYSCALL_H_ | ||
| 4 | #define _ASM_PARISC_SYSCALL_H_ | ||
| 5 | |||
| 6 | #include <linux/err.h> | ||
| 7 | #include <asm/ptrace.h> | ||
| 8 | |||
| 9 | static inline long syscall_get_nr(struct task_struct *tsk, | ||
| 10 | struct pt_regs *regs) | ||
| 11 | { | ||
| 12 | return regs->gr[20]; | ||
| 13 | } | ||
| 14 | |||
| 15 | static inline void syscall_get_arguments(struct task_struct *tsk, | ||
| 16 | struct pt_regs *regs, unsigned int i, | ||
| 17 | unsigned int n, unsigned long *args) | ||
| 18 | { | ||
| 19 | BUG_ON(i); | ||
| 20 | |||
| 21 | switch (n) { | ||
| 22 | case 6: | ||
| 23 | args[5] = regs->gr[21]; | ||
| 24 | case 5: | ||
| 25 | args[4] = regs->gr[22]; | ||
| 26 | case 4: | ||
| 27 | args[3] = regs->gr[23]; | ||
| 28 | case 3: | ||
| 29 | args[2] = regs->gr[24]; | ||
| 30 | case 2: | ||
| 31 | args[1] = regs->gr[25]; | ||
| 32 | case 1: | ||
| 33 | args[0] = regs->gr[26]; | ||
| 34 | break; | ||
| 35 | default: | ||
| 36 | BUG(); | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | #endif /*_ASM_PARISC_SYSCALL_H_*/ | ||
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h index ac775a76bff7..7ecc1039cfed 100644 --- a/arch/parisc/include/asm/thread_info.h +++ b/arch/parisc/include/asm/thread_info.h | |||
| @@ -32,6 +32,11 @@ struct thread_info { | |||
| 32 | #define init_thread_info (init_thread_union.thread_info) | 32 | #define init_thread_info (init_thread_union.thread_info) |
| 33 | #define init_stack (init_thread_union.stack) | 33 | #define init_stack (init_thread_union.stack) |
| 34 | 34 | ||
| 35 | /* how to get the thread information struct from C */ | ||
| 36 | #define current_thread_info() ((struct thread_info *)mfctl(30)) | ||
| 37 | |||
| 38 | #endif /* !__ASSEMBLY */ | ||
| 39 | |||
| 35 | /* thread information allocation */ | 40 | /* thread information allocation */ |
| 36 | 41 | ||
| 37 | #define THREAD_SIZE_ORDER 2 | 42 | #define THREAD_SIZE_ORDER 2 |
| @@ -40,11 +45,6 @@ struct thread_info { | |||
| 40 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) | 45 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) |
| 41 | #define THREAD_SHIFT (PAGE_SHIFT + THREAD_SIZE_ORDER) | 46 | #define THREAD_SHIFT (PAGE_SHIFT + THREAD_SIZE_ORDER) |
| 42 | 47 | ||
| 43 | /* how to get the thread information struct from C */ | ||
| 44 | #define current_thread_info() ((struct thread_info *)mfctl(30)) | ||
| 45 | |||
| 46 | #endif /* !__ASSEMBLY */ | ||
| 47 | |||
| 48 | #define PREEMPT_ACTIVE_BIT 28 | 48 | #define PREEMPT_ACTIVE_BIT 28 |
| 49 | #define PREEMPT_ACTIVE (1 << PREEMPT_ACTIVE_BIT) | 49 | #define PREEMPT_ACTIVE (1 << PREEMPT_ACTIVE_BIT) |
| 50 | 50 | ||
| @@ -60,6 +60,8 @@ struct thread_info { | |||
| 60 | #define TIF_RESTORE_SIGMASK 6 /* restore saved signal mask */ | 60 | #define TIF_RESTORE_SIGMASK 6 /* restore saved signal mask */ |
| 61 | #define TIF_FREEZE 7 /* is freezing for suspend */ | 61 | #define TIF_FREEZE 7 /* is freezing for suspend */ |
| 62 | #define TIF_NOTIFY_RESUME 8 /* callback before returning to user */ | 62 | #define TIF_NOTIFY_RESUME 8 /* callback before returning to user */ |
| 63 | #define TIF_SINGLESTEP 9 /* single stepping? */ | ||
| 64 | #define TIF_BLOCKSTEP 10 /* branch stepping? */ | ||
| 63 | 65 | ||
| 64 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 66 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
| 65 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 67 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) |
| @@ -69,6 +71,8 @@ struct thread_info { | |||
| 69 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | 71 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) |
| 70 | #define _TIF_FREEZE (1 << TIF_FREEZE) | 72 | #define _TIF_FREEZE (1 << TIF_FREEZE) |
| 71 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | 73 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
| 74 | #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) | ||
| 75 | #define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) | ||
| 72 | 76 | ||
| 73 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \ | 77 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \ |
| 74 | _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) | 78 | _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) |
diff --git a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c index 699cf8ef2118..fcd3c707bf12 100644 --- a/arch/parisc/kernel/asm-offsets.c +++ b/arch/parisc/kernel/asm-offsets.c | |||
| @@ -270,8 +270,8 @@ int main(void) | |||
| 270 | DEFINE(DTLB_OFF_COUNT, offsetof(struct pdc_cache_info, dt_off_count)); | 270 | DEFINE(DTLB_OFF_COUNT, offsetof(struct pdc_cache_info, dt_off_count)); |
| 271 | DEFINE(DTLB_LOOP, offsetof(struct pdc_cache_info, dt_loop)); | 271 | DEFINE(DTLB_LOOP, offsetof(struct pdc_cache_info, dt_loop)); |
| 272 | BLANK(); | 272 | BLANK(); |
| 273 | DEFINE(PA_BLOCKSTEP_BIT, 31-PT_BLOCKSTEP_BIT); | 273 | DEFINE(TIF_BLOCKSTEP_PA_BIT, 31-TIF_BLOCKSTEP); |
| 274 | DEFINE(PA_SINGLESTEP_BIT, 31-PT_SINGLESTEP_BIT); | 274 | DEFINE(TIF_SINGLESTEP_PA_BIT, 31-TIF_SINGLESTEP); |
| 275 | BLANK(); | 275 | BLANK(); |
| 276 | DEFINE(ASM_PMD_SHIFT, PMD_SHIFT); | 276 | DEFINE(ASM_PMD_SHIFT, PMD_SHIFT); |
| 277 | DEFINE(ASM_PGDIR_SHIFT, PGDIR_SHIFT); | 277 | DEFINE(ASM_PGDIR_SHIFT, PGDIR_SHIFT); |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 8c4712b74dc1..3a44f7f704fa 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
| @@ -2047,12 +2047,13 @@ syscall_do_signal: | |||
| 2047 | b,n syscall_check_sig | 2047 | b,n syscall_check_sig |
| 2048 | 2048 | ||
| 2049 | syscall_restore: | 2049 | syscall_restore: |
| 2050 | /* Are we being ptraced? */ | ||
| 2051 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | 2050 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 |
| 2052 | 2051 | ||
| 2053 | ldw TASK_PTRACE(%r1), %r19 | 2052 | /* Are we being ptraced? */ |
| 2054 | bb,< %r19,31,syscall_restore_rfi | 2053 | ldw TASK_FLAGS(%r1),%r19 |
| 2055 | nop | 2054 | ldi (_TIF_SINGLESTEP|_TIF_BLOCKSTEP),%r2 |
| 2055 | and,COND(=) %r19,%r2,%r0 | ||
| 2056 | b,n syscall_restore_rfi | ||
| 2056 | 2057 | ||
| 2057 | ldo TASK_PT_FR31(%r1),%r19 /* reload fpregs */ | 2058 | ldo TASK_PT_FR31(%r1),%r19 /* reload fpregs */ |
| 2058 | rest_fp %r19 | 2059 | rest_fp %r19 |
| @@ -2113,16 +2114,16 @@ syscall_restore_rfi: | |||
| 2113 | ldi 0x0b,%r20 /* Create new PSW */ | 2114 | ldi 0x0b,%r20 /* Create new PSW */ |
| 2114 | depi -1,13,1,%r20 /* C, Q, D, and I bits */ | 2115 | depi -1,13,1,%r20 /* C, Q, D, and I bits */ |
| 2115 | 2116 | ||
| 2116 | /* The values of PA_SINGLESTEP_BIT and PA_BLOCKSTEP_BIT are | 2117 | /* The values of SINGLESTEP_BIT and BLOCKSTEP_BIT are |
| 2117 | * set in include/linux/ptrace.h and converted to PA bitmap | 2118 | * set in thread_info.h and converted to PA bitmap |
| 2118 | * numbers in asm-offsets.c */ | 2119 | * numbers in asm-offsets.c */ |
| 2119 | 2120 | ||
| 2120 | /* if ((%r19.PA_SINGLESTEP_BIT)) { %r20.27=1} */ | 2121 | /* if ((%r19.SINGLESTEP_BIT)) { %r20.27=1} */ |
| 2121 | extru,= %r19,PA_SINGLESTEP_BIT,1,%r0 | 2122 | extru,= %r19,TIF_SINGLESTEP_PA_BIT,1,%r0 |
| 2122 | depi -1,27,1,%r20 /* R bit */ | 2123 | depi -1,27,1,%r20 /* R bit */ |
| 2123 | 2124 | ||
| 2124 | /* if ((%r19.PA_BLOCKSTEP_BIT)) { %r20.7=1} */ | 2125 | /* if ((%r19.BLOCKSTEP_BIT)) { %r20.7=1} */ |
| 2125 | extru,= %r19,PA_BLOCKSTEP_BIT,1,%r0 | 2126 | extru,= %r19,TIF_BLOCKSTEP_PA_BIT,1,%r0 |
| 2126 | depi -1,7,1,%r20 /* T bit */ | 2127 | depi -1,7,1,%r20 /* T bit */ |
| 2127 | 2128 | ||
| 2128 | STREG %r20,TASK_PT_PSW(%r1) | 2129 | STREG %r20,TASK_PT_PSW(%r1) |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 330f536a9324..2e7610cb33d5 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -423,8 +423,3 @@ void __init init_IRQ(void) | |||
| 423 | set_eiem(cpu_eiem); /* EIEM : enable all external intr */ | 423 | set_eiem(cpu_eiem); /* EIEM : enable all external intr */ |
| 424 | 424 | ||
| 425 | } | 425 | } |
| 426 | |||
| 427 | void ack_bad_irq(unsigned int irq) | ||
| 428 | { | ||
| 429 | printk(KERN_WARNING "unexpected IRQ %d\n", irq); | ||
| 430 | } | ||
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 61ee0eec4e69..212074653df7 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
| @@ -893,7 +893,7 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
| 893 | * ourselves */ | 893 | * ourselves */ |
| 894 | for (i = 1; i < hdr->e_shnum; i++) { | 894 | for (i = 1; i < hdr->e_shnum; i++) { |
| 895 | if(sechdrs[i].sh_type == SHT_SYMTAB | 895 | if(sechdrs[i].sh_type == SHT_SYMTAB |
| 896 | && (sechdrs[i].sh_type & SHF_ALLOC)) { | 896 | && (sechdrs[i].sh_flags & SHF_ALLOC)) { |
| 897 | int strindex = sechdrs[i].sh_link; | 897 | int strindex = sechdrs[i].sh_link; |
| 898 | /* FIXME: AWFUL HACK | 898 | /* FIXME: AWFUL HACK |
| 899 | * The cast is to drop the const from | 899 | * The cast is to drop the const from |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 927db3668b6f..c4f49e45129d 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
| 14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
| 15 | #include <linux/ptrace.h> | 15 | #include <linux/ptrace.h> |
| 16 | #include <linux/tracehook.h> | ||
| 16 | #include <linux/user.h> | 17 | #include <linux/user.h> |
| 17 | #include <linux/personality.h> | 18 | #include <linux/personality.h> |
| 18 | #include <linux/security.h> | 19 | #include <linux/security.h> |
| @@ -35,7 +36,8 @@ | |||
| 35 | */ | 36 | */ |
| 36 | void ptrace_disable(struct task_struct *task) | 37 | void ptrace_disable(struct task_struct *task) |
| 37 | { | 38 | { |
| 38 | task->ptrace &= ~(PT_SINGLESTEP|PT_BLOCKSTEP); | 39 | clear_tsk_thread_flag(task, TIF_SINGLESTEP); |
| 40 | clear_tsk_thread_flag(task, TIF_BLOCKSTEP); | ||
| 39 | 41 | ||
| 40 | /* make sure the trap bits are not set */ | 42 | /* make sure the trap bits are not set */ |
| 41 | pa_psw(task)->r = 0; | 43 | pa_psw(task)->r = 0; |
| @@ -55,8 +57,8 @@ void user_disable_single_step(struct task_struct *task) | |||
| 55 | 57 | ||
| 56 | void user_enable_single_step(struct task_struct *task) | 58 | void user_enable_single_step(struct task_struct *task) |
| 57 | { | 59 | { |
| 58 | task->ptrace &= ~PT_BLOCKSTEP; | 60 | clear_tsk_thread_flag(task, TIF_BLOCKSTEP); |
| 59 | task->ptrace |= PT_SINGLESTEP; | 61 | set_tsk_thread_flag(task, TIF_SINGLESTEP); |
| 60 | 62 | ||
| 61 | if (pa_psw(task)->n) { | 63 | if (pa_psw(task)->n) { |
| 62 | struct siginfo si; | 64 | struct siginfo si; |
| @@ -98,8 +100,8 @@ void user_enable_single_step(struct task_struct *task) | |||
| 98 | 100 | ||
| 99 | void user_enable_block_step(struct task_struct *task) | 101 | void user_enable_block_step(struct task_struct *task) |
| 100 | { | 102 | { |
| 101 | task->ptrace &= ~PT_SINGLESTEP; | 103 | clear_tsk_thread_flag(task, TIF_SINGLESTEP); |
| 102 | task->ptrace |= PT_BLOCKSTEP; | 104 | set_tsk_thread_flag(task, TIF_BLOCKSTEP); |
| 103 | 105 | ||
| 104 | /* Enable taken branch trap. */ | 106 | /* Enable taken branch trap. */ |
| 105 | pa_psw(task)->r = 0; | 107 | pa_psw(task)->r = 0; |
| @@ -263,22 +265,20 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 263 | } | 265 | } |
| 264 | #endif | 266 | #endif |
| 265 | 267 | ||
| 268 | long do_syscall_trace_enter(struct pt_regs *regs) | ||
| 269 | { | ||
| 270 | if (test_thread_flag(TIF_SYSCALL_TRACE) && | ||
| 271 | tracehook_report_syscall_entry(regs)) | ||
| 272 | return -1L; | ||
| 273 | |||
| 274 | return regs->gr[20]; | ||
| 275 | } | ||
| 266 | 276 | ||
| 267 | void syscall_trace(void) | 277 | void do_syscall_trace_exit(struct pt_regs *regs) |
| 268 | { | 278 | { |
| 269 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 279 | int stepping = test_thread_flag(TIF_SINGLESTEP) || |
| 270 | return; | 280 | test_thread_flag(TIF_BLOCKSTEP); |
| 271 | if (!(current->ptrace & PT_PTRACED)) | 281 | |
| 272 | return; | 282 | if (stepping || test_thread_flag(TIF_SYSCALL_TRACE)) |
| 273 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | 283 | tracehook_report_syscall_exit(regs, stepping); |
| 274 | ? 0x80 : 0)); | ||
| 275 | /* | ||
| 276 | * this isn't the same as continuing with a signal, but it will do | ||
| 277 | * for normal use. strace only continues with a signal if the | ||
| 278 | * stopping signal is not SIGTRAP. -brl | ||
| 279 | */ | ||
| 280 | if (current->exit_code) { | ||
| 281 | send_sig(current->exit_code, current, 1); | ||
| 282 | current->exit_code = 0; | ||
| 283 | } | ||
| 284 | } | 284 | } |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 8eb3c63c407a..e8467e4aa8d1 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
| 22 | #include <linux/wait.h> | 22 | #include <linux/wait.h> |
| 23 | #include <linux/ptrace.h> | 23 | #include <linux/ptrace.h> |
| 24 | #include <linux/tracehook.h> | ||
| 24 | #include <linux/unistd.h> | 25 | #include <linux/unistd.h> |
| 25 | #include <linux/stddef.h> | 26 | #include <linux/stddef.h> |
| 26 | #include <linux/compat.h> | 27 | #include <linux/compat.h> |
| @@ -34,7 +35,6 @@ | |||
| 34 | #include <asm/asm-offsets.h> | 35 | #include <asm/asm-offsets.h> |
| 35 | 36 | ||
| 36 | #ifdef CONFIG_COMPAT | 37 | #ifdef CONFIG_COMPAT |
| 37 | #include <linux/compat.h> | ||
| 38 | #include "signal32.h" | 38 | #include "signal32.h" |
| 39 | #endif | 39 | #endif |
| 40 | 40 | ||
| @@ -468,6 +468,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 468 | sigaddset(¤t->blocked,sig); | 468 | sigaddset(¤t->blocked,sig); |
| 469 | recalc_sigpending(); | 469 | recalc_sigpending(); |
| 470 | spin_unlock_irq(¤t->sighand->siglock); | 470 | spin_unlock_irq(¤t->sighand->siglock); |
| 471 | |||
| 472 | tracehook_signal_handler(sig, info, ka, regs, 0); | ||
| 473 | |||
| 471 | return 1; | 474 | return 1; |
| 472 | } | 475 | } |
| 473 | 476 | ||
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 59fc1a43ec3e..f5f96021caa0 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
| @@ -288,18 +288,23 @@ tracesys: | |||
| 288 | STREG %r18,PT_GR18(%r2) | 288 | STREG %r18,PT_GR18(%r2) |
| 289 | /* Finished saving things for the debugger */ | 289 | /* Finished saving things for the debugger */ |
| 290 | 290 | ||
| 291 | ldil L%syscall_trace,%r1 | 291 | copy %r2,%r26 |
| 292 | ldil L%do_syscall_trace_enter,%r1 | ||
| 292 | ldil L%tracesys_next,%r2 | 293 | ldil L%tracesys_next,%r2 |
| 293 | be R%syscall_trace(%sr7,%r1) | 294 | be R%do_syscall_trace_enter(%sr7,%r1) |
| 294 | ldo R%tracesys_next(%r2),%r2 | 295 | ldo R%tracesys_next(%r2),%r2 |
| 295 | 296 | ||
| 296 | tracesys_next: | 297 | tracesys_next: |
| 298 | /* do_syscall_trace_enter either returned the syscallno, or -1L, | ||
| 299 | * so we skip restoring the PT_GR20 below, since we pulled it from | ||
| 300 | * task->thread.regs.gr[20] above. | ||
| 301 | */ | ||
| 302 | copy %ret0,%r20 | ||
| 297 | ldil L%sys_call_table,%r1 | 303 | ldil L%sys_call_table,%r1 |
| 298 | ldo R%sys_call_table(%r1), %r19 | 304 | ldo R%sys_call_table(%r1), %r19 |
| 299 | 305 | ||
| 300 | ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ | 306 | ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ |
| 301 | LDREG TI_TASK(%r1), %r1 | 307 | LDREG TI_TASK(%r1), %r1 |
| 302 | LDREG TASK_PT_GR20(%r1), %r20 | ||
| 303 | LDREG TASK_PT_GR26(%r1), %r26 /* Restore the users args */ | 308 | LDREG TASK_PT_GR26(%r1), %r26 /* Restore the users args */ |
| 304 | LDREG TASK_PT_GR25(%r1), %r25 | 309 | LDREG TASK_PT_GR25(%r1), %r25 |
| 305 | LDREG TASK_PT_GR24(%r1), %r24 | 310 | LDREG TASK_PT_GR24(%r1), %r24 |
| @@ -336,7 +341,8 @@ tracesys_exit: | |||
| 336 | #ifdef CONFIG_64BIT | 341 | #ifdef CONFIG_64BIT |
| 337 | ldo -16(%r30),%r29 /* Reference param save area */ | 342 | ldo -16(%r30),%r29 /* Reference param save area */ |
| 338 | #endif | 343 | #endif |
| 339 | bl syscall_trace, %r2 | 344 | ldo TASK_REGS(%r1),%r26 |
| 345 | bl do_syscall_trace_exit,%r2 | ||
| 340 | STREG %r28,TASK_PT_GR28(%r1) /* save return value now */ | 346 | STREG %r28,TASK_PT_GR28(%r1) /* save return value now */ |
| 341 | ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ | 347 | ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ |
| 342 | LDREG TI_TASK(%r1), %r1 | 348 | LDREG TI_TASK(%r1), %r1 |
| @@ -353,12 +359,12 @@ tracesys_exit: | |||
| 353 | 359 | ||
| 354 | tracesys_sigexit: | 360 | tracesys_sigexit: |
| 355 | ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ | 361 | ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ |
| 356 | LDREG 0(%r1), %r1 | 362 | LDREG TI_TASK(%r1), %r1 |
| 357 | #ifdef CONFIG_64BIT | 363 | #ifdef CONFIG_64BIT |
| 358 | ldo -16(%r30),%r29 /* Reference param save area */ | 364 | ldo -16(%r30),%r29 /* Reference param save area */ |
| 359 | #endif | 365 | #endif |
| 360 | bl syscall_trace, %r2 | 366 | bl do_syscall_trace_exit,%r2 |
| 361 | nop | 367 | ldo TASK_REGS(%r1),%r26 |
| 362 | 368 | ||
| 363 | ldil L%syscall_exit_rfi,%r1 | 369 | ldil L%syscall_exit_rfi,%r1 |
| 364 | be,n R%syscall_exit_rfi(%sr7,%r1) | 370 | be,n R%syscall_exit_rfi(%sr7,%r1) |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 775be2791bc2..fda4baa059b5 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <asm/cache.h> | 28 | #include <asm/cache.h> |
| 29 | #include <asm/page.h> | 29 | #include <asm/page.h> |
| 30 | #include <asm/asm-offsets.h> | 30 | #include <asm/asm-offsets.h> |
| 31 | #include <asm/thread_info.h> | ||
| 31 | 32 | ||
| 32 | /* ld script to make hppa Linux kernel */ | 33 | /* ld script to make hppa Linux kernel */ |
| 33 | #ifndef CONFIG_64BIT | 34 | #ifndef CONFIG_64BIT |
| @@ -134,6 +135,15 @@ SECTIONS | |||
| 134 | __init_begin = .; | 135 | __init_begin = .; |
| 135 | INIT_TEXT_SECTION(16384) | 136 | INIT_TEXT_SECTION(16384) |
| 136 | INIT_DATA_SECTION(16) | 137 | INIT_DATA_SECTION(16) |
| 138 | /* we have to discard exit text and such at runtime, not link time */ | ||
| 139 | .exit.text : | ||
| 140 | { | ||
| 141 | EXIT_TEXT | ||
| 142 | } | ||
| 143 | .exit.data : | ||
| 144 | { | ||
| 145 | EXIT_DATA | ||
| 146 | } | ||
| 137 | 147 | ||
| 138 | PERCPU(PAGE_SIZE) | 148 | PERCPU(PAGE_SIZE) |
| 139 | . = ALIGN(PAGE_SIZE); | 149 | . = ALIGN(PAGE_SIZE); |
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index d5aca31fddbb..13b6e3e59b99 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c | |||
| @@ -434,8 +434,8 @@ void mark_rodata_ro(void) | |||
| 434 | #define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \ | 434 | #define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \ |
| 435 | & ~(VM_MAP_OFFSET-1))) | 435 | & ~(VM_MAP_OFFSET-1))) |
| 436 | 436 | ||
| 437 | void *vmalloc_start __read_mostly; | 437 | void *parisc_vmalloc_start __read_mostly; |
| 438 | EXPORT_SYMBOL(vmalloc_start); | 438 | EXPORT_SYMBOL(parisc_vmalloc_start); |
| 439 | 439 | ||
| 440 | #ifdef CONFIG_PA11 | 440 | #ifdef CONFIG_PA11 |
| 441 | unsigned long pcxl_dma_start __read_mostly; | 441 | unsigned long pcxl_dma_start __read_mostly; |
| @@ -496,13 +496,14 @@ void __init mem_init(void) | |||
| 496 | #ifdef CONFIG_PA11 | 496 | #ifdef CONFIG_PA11 |
| 497 | if (hppa_dma_ops == &pcxl_dma_ops) { | 497 | if (hppa_dma_ops == &pcxl_dma_ops) { |
| 498 | pcxl_dma_start = (unsigned long)SET_MAP_OFFSET(MAP_START); | 498 | pcxl_dma_start = (unsigned long)SET_MAP_OFFSET(MAP_START); |
| 499 | vmalloc_start = SET_MAP_OFFSET(pcxl_dma_start + PCXL_DMA_MAP_SIZE); | 499 | parisc_vmalloc_start = SET_MAP_OFFSET(pcxl_dma_start |
| 500 | + PCXL_DMA_MAP_SIZE); | ||
| 500 | } else { | 501 | } else { |
| 501 | pcxl_dma_start = 0; | 502 | pcxl_dma_start = 0; |
| 502 | vmalloc_start = SET_MAP_OFFSET(MAP_START); | 503 | parisc_vmalloc_start = SET_MAP_OFFSET(MAP_START); |
| 503 | } | 504 | } |
| 504 | #else | 505 | #else |
| 505 | vmalloc_start = SET_MAP_OFFSET(MAP_START); | 506 | parisc_vmalloc_start = SET_MAP_OFFSET(MAP_START); |
| 506 | #endif | 507 | #endif |
| 507 | 508 | ||
| 508 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n", | 509 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n", |
diff --git a/arch/sh/boards/board-magicpanelr2.c b/arch/sh/boards/board-magicpanelr2.c index 0a37c8bfc959..99ffc5f1c0dd 100644 --- a/arch/sh/boards/board-magicpanelr2.c +++ b/arch/sh/boards/board-magicpanelr2.c | |||
| @@ -205,8 +205,6 @@ static void __init setup_port_multiplexing(void) | |||
| 205 | 205 | ||
| 206 | static void __init mpr2_setup(char **cmdline_p) | 206 | static void __init mpr2_setup(char **cmdline_p) |
| 207 | { | 207 | { |
| 208 | __set_io_port_base(0xa0000000); | ||
| 209 | |||
| 210 | /* set Pin Select Register A: | 208 | /* set Pin Select Register A: |
| 211 | * /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, | 209 | * /PCC_CD1, /PCC_CD2, PCC_BVD1, PCC_BVD2, |
| 212 | * /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND | 210 | * /IOIS16, IRQ4, IRQ5, USB1d_SUSPEND |
diff --git a/arch/sh/boards/mach-dreamcast/setup.c b/arch/sh/boards/mach-dreamcast/setup.c index ebe99227d4e6..a4b7402d6176 100644 --- a/arch/sh/boards/mach-dreamcast/setup.c +++ b/arch/sh/boards/mach-dreamcast/setup.c | |||
| @@ -42,8 +42,6 @@ static void __init dreamcast_setup(char **cmdline_p) | |||
| 42 | /* Acknowledge any previous events */ | 42 | /* Acknowledge any previous events */ |
| 43 | /* XXX */ | 43 | /* XXX */ |
| 44 | 44 | ||
| 45 | __set_io_port_base(0xa0000000); | ||
| 46 | |||
| 47 | /* Assign all virtual IRQs to the System ASIC int. handler */ | 45 | /* Assign all virtual IRQs to the System ASIC int. handler */ |
| 48 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) | 46 | for (i = HW_EVENT_IRQ_BASE; i < HW_EVENT_IRQ_MAX; i++) |
| 49 | set_irq_chip_and_handler(i, &systemasic_int, | 47 | set_irq_chip_and_handler(i, &systemasic_int, |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 5f9881e16e2f..3b1ceb46fa54 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
| 19 | #include <linux/usb/r8a66597.h> | 19 | #include <linux/usb/r8a66597.h> |
| 20 | #include <linux/i2c.h> | 20 | #include <linux/i2c.h> |
| 21 | #include <linux/i2c/tsc2007.h> | ||
| 21 | #include <linux/input.h> | 22 | #include <linux/input.h> |
| 22 | #include <video/sh_mobile_lcdc.h> | 23 | #include <video/sh_mobile_lcdc.h> |
| 23 | #include <media/sh_mobile_ceu.h> | 24 | #include <media/sh_mobile_ceu.h> |
| @@ -38,6 +39,20 @@ | |||
| 38 | * 0x1800_0000 MFI 16bit | 39 | * 0x1800_0000 MFI 16bit |
| 39 | */ | 40 | */ |
| 40 | 41 | ||
| 42 | /* SWITCH | ||
| 43 | *------------------------------ | ||
| 44 | * DS2[1] = FlashROM write protect ON : write protect | ||
| 45 | * OFF : No write protect | ||
| 46 | * DS2[2] = RMII / TS, SCIF ON : RMII | ||
| 47 | * OFF : TS, SCIF3 | ||
| 48 | * DS2[3] = Camera / Video ON : Camera | ||
| 49 | * OFF : NTSC/PAL (IN) | ||
| 50 | * DS2[5] = NTSC_OUT Clock ON : On board OSC | ||
| 51 | * OFF : SH7724 DV_CLK | ||
| 52 | * DS2[6-7] = MMC / SD ON-OFF : SD | ||
| 53 | * OFF-ON : MMC | ||
| 54 | */ | ||
| 55 | |||
| 41 | /* Heartbeat */ | 56 | /* Heartbeat */ |
| 42 | static unsigned char led_pos[] = { 0, 1, 2, 3 }; | 57 | static unsigned char led_pos[] = { 0, 1, 2, 3 }; |
| 43 | static struct heartbeat_data heartbeat_data = { | 58 | static struct heartbeat_data heartbeat_data = { |
| @@ -70,7 +85,7 @@ static struct mtd_partition nor_flash_partitions[] = { | |||
| 70 | .name = "boot loader", | 85 | .name = "boot loader", |
| 71 | .offset = 0, | 86 | .offset = 0, |
| 72 | .size = (5 * 1024 * 1024), | 87 | .size = (5 * 1024 * 1024), |
| 73 | .mask_flags = MTD_CAP_ROM, | 88 | .mask_flags = MTD_WRITEABLE, /* force read-only */ |
| 74 | }, { | 89 | }, { |
| 75 | .name = "free-area", | 90 | .name = "free-area", |
| 76 | .offset = MTDPART_OFS_APPEND, | 91 | .offset = MTDPART_OFS_APPEND, |
| @@ -376,6 +391,43 @@ static struct platform_device keysc_device = { | |||
| 376 | }, | 391 | }, |
| 377 | }; | 392 | }; |
| 378 | 393 | ||
| 394 | /* TouchScreen */ | ||
| 395 | #define IRQ0 32 | ||
| 396 | static int ts_get_pendown_state(void) | ||
| 397 | { | ||
| 398 | int val = 0; | ||
| 399 | gpio_free(GPIO_FN_INTC_IRQ0); | ||
| 400 | gpio_request(GPIO_PTZ0, NULL); | ||
| 401 | gpio_direction_input(GPIO_PTZ0); | ||
| 402 | |||
| 403 | val = gpio_get_value(GPIO_PTZ0); | ||
| 404 | |||
| 405 | gpio_free(GPIO_PTZ0); | ||
| 406 | gpio_request(GPIO_FN_INTC_IRQ0, NULL); | ||
| 407 | |||
| 408 | return val ? 0 : 1; | ||
| 409 | } | ||
| 410 | |||
| 411 | static int ts_init(void) | ||
| 412 | { | ||
| 413 | gpio_request(GPIO_FN_INTC_IRQ0, NULL); | ||
| 414 | return 0; | ||
| 415 | } | ||
| 416 | |||
| 417 | struct tsc2007_platform_data tsc2007_info = { | ||
| 418 | .model = 2007, | ||
| 419 | .x_plate_ohms = 180, | ||
| 420 | .get_pendown_state = ts_get_pendown_state, | ||
| 421 | .init_platform_hw = ts_init, | ||
| 422 | }; | ||
| 423 | |||
| 424 | static struct i2c_board_info ts_i2c_clients = { | ||
| 425 | I2C_BOARD_INFO("tsc2007", 0x48), | ||
| 426 | .type = "tsc2007", | ||
| 427 | .platform_data = &tsc2007_info, | ||
| 428 | .irq = IRQ0, | ||
| 429 | }; | ||
| 430 | |||
| 379 | static struct platform_device *ecovec_devices[] __initdata = { | 431 | static struct platform_device *ecovec_devices[] __initdata = { |
| 380 | &heartbeat_device, | 432 | &heartbeat_device, |
| 381 | &nor_flash_device, | 433 | &nor_flash_device, |
| @@ -460,6 +512,11 @@ static void __init sh_eth_init(void) | |||
| 460 | #define IODRIVEA 0xA405018A | 512 | #define IODRIVEA 0xA405018A |
| 461 | static int __init arch_setup(void) | 513 | static int __init arch_setup(void) |
| 462 | { | 514 | { |
| 515 | /* enable STATUS0, STATUS2 and PDSTATUS */ | ||
| 516 | gpio_request(GPIO_FN_STATUS0, NULL); | ||
| 517 | gpio_request(GPIO_FN_STATUS2, NULL); | ||
| 518 | gpio_request(GPIO_FN_PDSTATUS, NULL); | ||
| 519 | |||
| 463 | /* enable SCIFA0 */ | 520 | /* enable SCIFA0 */ |
| 464 | gpio_request(GPIO_FN_SCIF0_TXD, NULL); | 521 | gpio_request(GPIO_FN_SCIF0_TXD, NULL); |
| 465 | gpio_request(GPIO_FN_SCIF0_RXD, NULL); | 522 | gpio_request(GPIO_FN_SCIF0_RXD, NULL); |
| @@ -590,6 +647,10 @@ static int __init arch_setup(void) | |||
| 590 | */ | 647 | */ |
| 591 | gpio_request(GPIO_PTF4, NULL); | 648 | gpio_request(GPIO_PTF4, NULL); |
| 592 | gpio_direction_output(GPIO_PTF4, 1); | 649 | gpio_direction_output(GPIO_PTF4, 1); |
| 650 | |||
| 651 | /* enable TouchScreen */ | ||
| 652 | i2c_register_board_info(0, &ts_i2c_clients, 1); | ||
| 653 | set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW); | ||
| 593 | } | 654 | } |
| 594 | 655 | ||
| 595 | /* enable CEU0 */ | 656 | /* enable CEU0 */ |
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index 0151933e5253..bb407ef0b91e 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
| @@ -152,8 +152,6 @@ call_do_page_fault: | |||
| 152 | mov.l 1f, r0 | 152 | mov.l 1f, r0 |
| 153 | mov.l @r0, r6 | 153 | mov.l @r0, r6 |
| 154 | 154 | ||
| 155 | sti | ||
| 156 | |||
| 157 | mov.l 3f, r0 | 155 | mov.l 3f, r0 |
| 158 | mov.l 4f, r1 | 156 | mov.l 4f, r1 |
| 159 | mov r15, r4 | 157 | mov r15, r4 |
diff --git a/arch/sh/kernel/io_generic.c b/arch/sh/kernel/io_generic.c index 4ff507239286..b8fa6524760a 100644 --- a/arch/sh/kernel/io_generic.c +++ b/arch/sh/kernel/io_generic.c | |||
| @@ -147,6 +147,9 @@ void generic_outsl(unsigned long port, const void *src, unsigned long count) | |||
| 147 | 147 | ||
| 148 | void __iomem *generic_ioport_map(unsigned long addr, unsigned int size) | 148 | void __iomem *generic_ioport_map(unsigned long addr, unsigned int size) |
| 149 | { | 149 | { |
| 150 | if (PXSEG(addr) >= P1SEG) | ||
| 151 | return (void __iomem *)addr; | ||
| 152 | |||
| 150 | return (void __iomem *)(addr + generic_io_base); | 153 | return (void __iomem *)(addr + generic_io_base); |
| 151 | } | 154 | } |
| 152 | 155 | ||
diff --git a/arch/sh/kernel/machvec.c b/arch/sh/kernel/machvec.c index 548f6607fd0f..cbce639b108a 100644 --- a/arch/sh/kernel/machvec.c +++ b/arch/sh/kernel/machvec.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/string.h> | 14 | #include <linux/string.h> |
| 15 | #include <asm/machvec.h> | 15 | #include <asm/machvec.h> |
| 16 | #include <asm/sections.h> | 16 | #include <asm/sections.h> |
| 17 | #include <asm/addrspace.h> | ||
| 17 | #include <asm/setup.h> | 18 | #include <asm/setup.h> |
| 18 | #include <asm/io.h> | 19 | #include <asm/io.h> |
| 19 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
| @@ -133,4 +134,6 @@ void __init sh_mv_setup(void) | |||
| 133 | 134 | ||
| 134 | if (!sh_mv.mv_nr_irqs) | 135 | if (!sh_mv.mv_nr_irqs) |
| 135 | sh_mv.mv_nr_irqs = NR_IRQS; | 136 | sh_mv.mv_nr_irqs = NR_IRQS; |
| 137 | |||
| 138 | __set_io_port_base(P2SEG); | ||
| 136 | } | 139 | } |
diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c index 8dbe26b17c44..86c270428357 100644 --- a/arch/sh/kernel/sh_ksyms_32.c +++ b/arch/sh/kernel/sh_ksyms_32.c | |||
| @@ -84,6 +84,7 @@ DECLARE_EXPORT(__movstrSI60); | |||
| 84 | DECLARE_EXPORT(__movstr_i4_even); | 84 | DECLARE_EXPORT(__movstr_i4_even); |
| 85 | DECLARE_EXPORT(__movstr_i4_odd); | 85 | DECLARE_EXPORT(__movstr_i4_odd); |
| 86 | DECLARE_EXPORT(__movstrSI12_i4); | 86 | DECLARE_EXPORT(__movstrSI12_i4); |
| 87 | DECLARE_EXPORT(__movmem); | ||
| 87 | DECLARE_EXPORT(__movmem_i4_even); | 88 | DECLARE_EXPORT(__movmem_i4_even); |
| 88 | DECLARE_EXPORT(__movmem_i4_odd); | 89 | DECLARE_EXPORT(__movmem_i4_odd); |
| 89 | DECLARE_EXPORT(__movmemSI12_i4); | 90 | DECLARE_EXPORT(__movmemSI12_i4); |
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c index 69bb1652eccd..e0b5e4b5accd 100644 --- a/arch/sh/kernel/traps_32.c +++ b/arch/sh/kernel/traps_32.c | |||
| @@ -54,8 +54,8 @@ static unsigned long se_multi; | |||
| 54 | /* bitfield: 1: warn 2: fixup 4: signal -> combinations 2|4 && 1|2|4 are not | 54 | /* bitfield: 1: warn 2: fixup 4: signal -> combinations 2|4 && 1|2|4 are not |
| 55 | valid! */ | 55 | valid! */ |
| 56 | static int se_usermode = 3; | 56 | static int se_usermode = 3; |
| 57 | /* 0: no warning 1: print a warning message */ | 57 | /* 0: no warning 1: print a warning message, disabled by default */ |
| 58 | static int se_kernmode_warn = 1; | 58 | static int se_kernmode_warn; |
| 59 | 59 | ||
| 60 | #ifdef CONFIG_PROC_FS | 60 | #ifdef CONFIG_PROC_FS |
| 61 | static const char *se_usermode_action[] = { | 61 | static const char *se_usermode_action[] = { |
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c index b2453bbef4cd..a98c7d8984fa 100644 --- a/arch/sh/mm/cache-sh4.c +++ b/arch/sh/mm/cache-sh4.c | |||
| @@ -43,7 +43,7 @@ static void (*__flush_dcache_segment_fn)(unsigned long, unsigned long) = | |||
| 43 | * Called from kernel/module.c:sys_init_module and routine for a.out format, | 43 | * Called from kernel/module.c:sys_init_module and routine for a.out format, |
| 44 | * signal handler code and kprobes code | 44 | * signal handler code and kprobes code |
| 45 | */ | 45 | */ |
| 46 | static void sh4_flush_icache_range(void *args) | 46 | static void __uses_jump_to_uncached sh4_flush_icache_range(void *args) |
| 47 | { | 47 | { |
| 48 | struct flusher_data *data = args; | 48 | struct flusher_data *data = args; |
| 49 | unsigned long start, end; | 49 | unsigned long start, end; |
diff --git a/arch/sh/mm/cache-sh7705.c b/arch/sh/mm/cache-sh7705.c index 2cadee2037ac..2601935eb589 100644 --- a/arch/sh/mm/cache-sh7705.c +++ b/arch/sh/mm/cache-sh7705.c | |||
| @@ -78,7 +78,7 @@ static void sh7705_flush_icache_range(void *args) | |||
| 78 | /* | 78 | /* |
| 79 | * Writeback&Invalidate the D-cache of the page | 79 | * Writeback&Invalidate the D-cache of the page |
| 80 | */ | 80 | */ |
| 81 | static void __flush_dcache_page(unsigned long phys) | 81 | static void __uses_jump_to_uncached __flush_dcache_page(unsigned long phys) |
| 82 | { | 82 | { |
| 83 | unsigned long ways, waysize, addrstart; | 83 | unsigned long ways, waysize, addrstart; |
| 84 | unsigned long flags; | 84 | unsigned long flags; |
| @@ -144,7 +144,7 @@ static void sh7705_flush_dcache_page(void *arg) | |||
| 144 | __flush_dcache_page(PHYSADDR(page_address(page))); | 144 | __flush_dcache_page(PHYSADDR(page_address(page))); |
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | static void sh7705_flush_cache_all(void *args) | 147 | static void __uses_jump_to_uncached sh7705_flush_cache_all(void *args) |
| 148 | { | 148 | { |
| 149 | unsigned long flags; | 149 | unsigned long flags; |
| 150 | 150 | ||
diff --git a/arch/sh/mm/ioremap_32.c b/arch/sh/mm/ioremap_32.c index c3250614e3ae..a86eaa9d75a5 100644 --- a/arch/sh/mm/ioremap_32.c +++ b/arch/sh/mm/ioremap_32.c | |||
| @@ -83,7 +83,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
| 83 | * | 83 | * |
| 84 | * PMB entries are all pre-faulted. | 84 | * PMB entries are all pre-faulted. |
| 85 | */ | 85 | */ |
| 86 | if (unlikely(size >= 0x1000000)) { | 86 | if (unlikely(phys_addr >= P1SEG)) { |
| 87 | unsigned long mapped = pmb_remap(addr, phys_addr, size, flags); | 87 | unsigned long mapped = pmb_remap(addr, phys_addr, size, flags); |
| 88 | 88 | ||
| 89 | if (likely(mapped)) { | 89 | if (likely(mapped)) { |
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index b1a714a92b14..aade31102112 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | 33 | ||
| 34 | #define NR_PMB_ENTRIES 16 | 34 | #define NR_PMB_ENTRIES 16 |
| 35 | 35 | ||
| 36 | static void __pmb_unmap(struct pmb_entry *); | ||
| 37 | |||
| 36 | static struct kmem_cache *pmb_cache; | 38 | static struct kmem_cache *pmb_cache; |
| 37 | static unsigned long pmb_map; | 39 | static unsigned long pmb_map; |
| 38 | 40 | ||
| @@ -218,9 +220,10 @@ static struct { | |||
| 218 | long pmb_remap(unsigned long vaddr, unsigned long phys, | 220 | long pmb_remap(unsigned long vaddr, unsigned long phys, |
| 219 | unsigned long size, unsigned long flags) | 221 | unsigned long size, unsigned long flags) |
| 220 | { | 222 | { |
| 221 | struct pmb_entry *pmbp; | 223 | struct pmb_entry *pmbp, *pmbe; |
| 222 | unsigned long wanted; | 224 | unsigned long wanted; |
| 223 | int pmb_flags, i; | 225 | int pmb_flags, i; |
| 226 | long err; | ||
| 224 | 227 | ||
| 225 | /* Convert typical pgprot value to the PMB equivalent */ | 228 | /* Convert typical pgprot value to the PMB equivalent */ |
| 226 | if (flags & _PAGE_CACHABLE) { | 229 | if (flags & _PAGE_CACHABLE) { |
| @@ -236,20 +239,22 @@ long pmb_remap(unsigned long vaddr, unsigned long phys, | |||
| 236 | 239 | ||
| 237 | again: | 240 | again: |
| 238 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { | 241 | for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) { |
| 239 | struct pmb_entry *pmbe; | ||
| 240 | int ret; | 242 | int ret; |
| 241 | 243 | ||
| 242 | if (size < pmb_sizes[i].size) | 244 | if (size < pmb_sizes[i].size) |
| 243 | continue; | 245 | continue; |
| 244 | 246 | ||
| 245 | pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag); | 247 | pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag); |
| 246 | if (IS_ERR(pmbe)) | 248 | if (IS_ERR(pmbe)) { |
| 247 | return PTR_ERR(pmbe); | 249 | err = PTR_ERR(pmbe); |
| 250 | goto out; | ||
| 251 | } | ||
| 248 | 252 | ||
| 249 | ret = set_pmb_entry(pmbe); | 253 | ret = set_pmb_entry(pmbe); |
| 250 | if (ret != 0) { | 254 | if (ret != 0) { |
| 251 | pmb_free(pmbe); | 255 | pmb_free(pmbe); |
| 252 | return -EBUSY; | 256 | err = -EBUSY; |
| 257 | goto out; | ||
| 253 | } | 258 | } |
| 254 | 259 | ||
| 255 | phys += pmb_sizes[i].size; | 260 | phys += pmb_sizes[i].size; |
| @@ -264,12 +269,25 @@ again: | |||
| 264 | pmbp->link = pmbe; | 269 | pmbp->link = pmbe; |
| 265 | 270 | ||
| 266 | pmbp = pmbe; | 271 | pmbp = pmbe; |
| 272 | |||
| 273 | /* | ||
| 274 | * Instead of trying smaller sizes on every iteration | ||
| 275 | * (even if we succeed in allocating space), try using | ||
| 276 | * pmb_sizes[i].size again. | ||
| 277 | */ | ||
| 278 | i--; | ||
| 267 | } | 279 | } |
| 268 | 280 | ||
| 269 | if (size >= 0x1000000) | 281 | if (size >= 0x1000000) |
| 270 | goto again; | 282 | goto again; |
| 271 | 283 | ||
| 272 | return wanted - size; | 284 | return wanted - size; |
| 285 | |||
| 286 | out: | ||
| 287 | if (pmbp) | ||
| 288 | __pmb_unmap(pmbp); | ||
| 289 | |||
| 290 | return err; | ||
| 273 | } | 291 | } |
| 274 | 292 | ||
| 275 | void pmb_unmap(unsigned long addr) | 293 | void pmb_unmap(unsigned long addr) |
| @@ -283,12 +301,19 @@ void pmb_unmap(unsigned long addr) | |||
| 283 | if (unlikely(!pmbe)) | 301 | if (unlikely(!pmbe)) |
| 284 | return; | 302 | return; |
| 285 | 303 | ||
| 304 | __pmb_unmap(pmbe); | ||
| 305 | } | ||
| 306 | |||
| 307 | static void __pmb_unmap(struct pmb_entry *pmbe) | ||
| 308 | { | ||
| 286 | WARN_ON(!test_bit(pmbe->entry, &pmb_map)); | 309 | WARN_ON(!test_bit(pmbe->entry, &pmb_map)); |
| 287 | 310 | ||
| 288 | do { | 311 | do { |
| 289 | struct pmb_entry *pmblink = pmbe; | 312 | struct pmb_entry *pmblink = pmbe; |
| 290 | 313 | ||
| 291 | clear_pmb_entry(pmbe); | 314 | if (pmbe->entry != PMB_NO_ENTRY) |
| 315 | clear_pmb_entry(pmbe); | ||
| 316 | |||
| 292 | pmbe = pmblink->link; | 317 | pmbe = pmblink->link; |
| 293 | 318 | ||
| 294 | pmb_free(pmblink); | 319 | pmb_free(pmblink); |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index ac45aab741a5..05ef5380a687 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
| @@ -26,6 +26,7 @@ config SPARC | |||
| 26 | select RTC_CLASS | 26 | select RTC_CLASS |
| 27 | select RTC_DRV_M48T59 | 27 | select RTC_DRV_M48T59 |
| 28 | select HAVE_PERF_EVENTS | 28 | select HAVE_PERF_EVENTS |
| 29 | select PERF_USE_VMALLOC | ||
| 29 | select HAVE_DMA_ATTRS | 30 | select HAVE_DMA_ATTRS |
| 30 | select HAVE_DMA_API_DEBUG | 31 | select HAVE_DMA_API_DEBUG |
| 31 | 32 | ||
| @@ -48,6 +49,7 @@ config SPARC64 | |||
| 48 | select RTC_DRV_SUN4V | 49 | select RTC_DRV_SUN4V |
| 49 | select RTC_DRV_STARFIRE | 50 | select RTC_DRV_STARFIRE |
| 50 | select HAVE_PERF_EVENTS | 51 | select HAVE_PERF_EVENTS |
| 52 | select PERF_USE_VMALLOC | ||
| 51 | 53 | ||
| 52 | config ARCH_DEFCONFIG | 54 | config ARCH_DEFCONFIG |
| 53 | string | 55 | string |
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h index b608a64c5814..f1363b72364f 100644 --- a/arch/x86/include/asm/mce.h +++ b/arch/x86/include/asm/mce.h | |||
| @@ -133,6 +133,8 @@ static inline void winchip_mcheck_init(struct cpuinfo_x86 *c) {} | |||
| 133 | static inline void enable_p5_mce(void) {} | 133 | static inline void enable_p5_mce(void) {} |
| 134 | #endif | 134 | #endif |
| 135 | 135 | ||
| 136 | extern void (*x86_mce_decode_callback)(struct mce *m); | ||
| 137 | |||
| 136 | void mce_setup(struct mce *m); | 138 | void mce_setup(struct mce *m); |
| 137 | void mce_log(struct mce *m); | 139 | void mce_log(struct mce *m); |
| 138 | DECLARE_PER_CPU(struct sys_device, mce_dev); | 140 | DECLARE_PER_CPU(struct sys_device, mce_dev); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 183c3457d2f4..b1598a9436d0 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -85,6 +85,18 @@ static DECLARE_WAIT_QUEUE_HEAD(mce_wait); | |||
| 85 | static DEFINE_PER_CPU(struct mce, mces_seen); | 85 | static DEFINE_PER_CPU(struct mce, mces_seen); |
| 86 | static int cpu_missing; | 86 | static int cpu_missing; |
| 87 | 87 | ||
| 88 | static void default_decode_mce(struct mce *m) | ||
| 89 | { | ||
| 90 | pr_emerg("No human readable MCE decoding support on this CPU type.\n"); | ||
| 91 | pr_emerg("Run the message through 'mcelog --ascii' to decode.\n"); | ||
| 92 | } | ||
| 93 | |||
| 94 | /* | ||
| 95 | * CPU/chipset specific EDAC code can register a callback here to print | ||
| 96 | * MCE errors in a human-readable form: | ||
| 97 | */ | ||
| 98 | void (*x86_mce_decode_callback)(struct mce *m) = default_decode_mce; | ||
| 99 | EXPORT_SYMBOL(x86_mce_decode_callback); | ||
| 88 | 100 | ||
| 89 | /* MCA banks polled by the period polling timer for corrected events */ | 101 | /* MCA banks polled by the period polling timer for corrected events */ |
| 90 | DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = { | 102 | DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = { |
| @@ -165,46 +177,46 @@ void mce_log(struct mce *mce) | |||
| 165 | set_bit(0, &mce_need_notify); | 177 | set_bit(0, &mce_need_notify); |
| 166 | } | 178 | } |
| 167 | 179 | ||
| 168 | void __weak decode_mce(struct mce *m) | ||
| 169 | { | ||
| 170 | return; | ||
| 171 | } | ||
| 172 | |||
| 173 | static void print_mce(struct mce *m) | 180 | static void print_mce(struct mce *m) |
| 174 | { | 181 | { |
| 175 | printk(KERN_EMERG | 182 | pr_emerg("CPU %d: Machine Check Exception: %16Lx Bank %d: %016Lx\n", |
| 176 | "CPU %d: Machine Check Exception: %16Lx Bank %d: %016Lx\n", | ||
| 177 | m->extcpu, m->mcgstatus, m->bank, m->status); | 183 | m->extcpu, m->mcgstatus, m->bank, m->status); |
| 184 | |||
| 178 | if (m->ip) { | 185 | if (m->ip) { |
| 179 | printk(KERN_EMERG "RIP%s %02x:<%016Lx> ", | 186 | pr_emerg("RIP%s %02x:<%016Lx> ", |
| 180 | !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "", | 187 | !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "", |
| 181 | m->cs, m->ip); | 188 | m->cs, m->ip); |
| 189 | |||
| 182 | if (m->cs == __KERNEL_CS) | 190 | if (m->cs == __KERNEL_CS) |
| 183 | print_symbol("{%s}", m->ip); | 191 | print_symbol("{%s}", m->ip); |
| 184 | printk(KERN_CONT "\n"); | 192 | pr_cont("\n"); |
| 185 | } | 193 | } |
| 186 | printk(KERN_EMERG "TSC %llx ", m->tsc); | 194 | |
| 195 | pr_emerg("TSC %llx ", m->tsc); | ||
| 187 | if (m->addr) | 196 | if (m->addr) |
| 188 | printk(KERN_CONT "ADDR %llx ", m->addr); | 197 | pr_cont("ADDR %llx ", m->addr); |
| 189 | if (m->misc) | 198 | if (m->misc) |
| 190 | printk(KERN_CONT "MISC %llx ", m->misc); | 199 | pr_cont("MISC %llx ", m->misc); |
| 191 | printk(KERN_CONT "\n"); | 200 | |
| 192 | printk(KERN_EMERG "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x\n", | 201 | pr_cont("\n"); |
| 193 | m->cpuvendor, m->cpuid, m->time, m->socketid, | 202 | pr_emerg("PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x\n", |
| 194 | m->apicid); | 203 | m->cpuvendor, m->cpuid, m->time, m->socketid, m->apicid); |
| 195 | 204 | ||
| 196 | decode_mce(m); | 205 | /* |
| 206 | * Print out human-readable details about the MCE error, | ||
| 207 | * (if the CPU has an implementation for that): | ||
| 208 | */ | ||
| 209 | x86_mce_decode_callback(m); | ||
| 197 | } | 210 | } |
| 198 | 211 | ||
| 199 | static void print_mce_head(void) | 212 | static void print_mce_head(void) |
| 200 | { | 213 | { |
| 201 | printk(KERN_EMERG "\nHARDWARE ERROR\n"); | 214 | pr_emerg("\nHARDWARE ERROR\n"); |
| 202 | } | 215 | } |
| 203 | 216 | ||
| 204 | static void print_mce_tail(void) | 217 | static void print_mce_tail(void) |
| 205 | { | 218 | { |
| 206 | printk(KERN_EMERG "This is not a software problem!\n" | 219 | pr_emerg("This is not a software problem!\n"); |
| 207 | "Run through mcelog --ascii to decode and contact your hardware vendor\n"); | ||
| 208 | } | 220 | } |
| 209 | 221 | ||
| 210 | #define PANIC_TIMEOUT 5 /* 5 seconds */ | 222 | #define PANIC_TIMEOUT 5 /* 5 seconds */ |
| @@ -218,6 +230,7 @@ static atomic_t mce_fake_paniced; | |||
| 218 | static void wait_for_panic(void) | 230 | static void wait_for_panic(void) |
| 219 | { | 231 | { |
| 220 | long timeout = PANIC_TIMEOUT*USEC_PER_SEC; | 232 | long timeout = PANIC_TIMEOUT*USEC_PER_SEC; |
| 233 | |||
| 221 | preempt_disable(); | 234 | preempt_disable(); |
| 222 | local_irq_enable(); | 235 | local_irq_enable(); |
| 223 | while (timeout-- > 0) | 236 | while (timeout-- > 0) |
| @@ -285,6 +298,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp) | |||
| 285 | static int msr_to_offset(u32 msr) | 298 | static int msr_to_offset(u32 msr) |
| 286 | { | 299 | { |
| 287 | unsigned bank = __get_cpu_var(injectm.bank); | 300 | unsigned bank = __get_cpu_var(injectm.bank); |
| 301 | |||
| 288 | if (msr == rip_msr) | 302 | if (msr == rip_msr) |
| 289 | return offsetof(struct mce, ip); | 303 | return offsetof(struct mce, ip); |
| 290 | if (msr == MSR_IA32_MCx_STATUS(bank)) | 304 | if (msr == MSR_IA32_MCx_STATUS(bank)) |
diff --git a/arch/x86/kernel/cpu/mtrr/if.c b/arch/x86/kernel/cpu/mtrr/if.c index f04e72527604..3c1b12d461d1 100644 --- a/arch/x86/kernel/cpu/mtrr/if.c +++ b/arch/x86/kernel/cpu/mtrr/if.c | |||
| @@ -96,17 +96,24 @@ mtrr_write(struct file *file, const char __user *buf, size_t len, loff_t * ppos) | |||
| 96 | unsigned long long base, size; | 96 | unsigned long long base, size; |
| 97 | char *ptr; | 97 | char *ptr; |
| 98 | char line[LINE_SIZE]; | 98 | char line[LINE_SIZE]; |
| 99 | int length; | ||
| 99 | size_t linelen; | 100 | size_t linelen; |
| 100 | 101 | ||
| 101 | if (!capable(CAP_SYS_ADMIN)) | 102 | if (!capable(CAP_SYS_ADMIN)) |
| 102 | return -EPERM; | 103 | return -EPERM; |
| 103 | if (!len) | ||
| 104 | return -EINVAL; | ||
| 105 | 104 | ||
| 106 | memset(line, 0, LINE_SIZE); | 105 | memset(line, 0, LINE_SIZE); |
| 107 | if (len > LINE_SIZE) | 106 | |
| 108 | len = LINE_SIZE; | 107 | length = len; |
| 109 | if (copy_from_user(line, buf, len - 1)) | 108 | length--; |
| 109 | |||
| 110 | if (length > LINE_SIZE - 1) | ||
| 111 | length = LINE_SIZE - 1; | ||
| 112 | |||
| 113 | if (length < 0) | ||
| 114 | return -EINVAL; | ||
| 115 | |||
| 116 | if (copy_from_user(line, buf, length)) | ||
| 110 | return -EFAULT; | 117 | return -EFAULT; |
| 111 | 118 | ||
| 112 | linelen = strlen(line); | 119 | linelen = strlen(line); |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 74656d1d4e30..391206199515 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -244,6 +244,7 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs) | |||
| 244 | __func__, smp_processor_id(), vector, irq); | 244 | __func__, smp_processor_id(), vector, irq); |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | run_local_timers(); | ||
| 247 | irq_exit(); | 248 | irq_exit(); |
| 248 | 249 | ||
| 249 | set_irq_regs(old_regs); | 250 | set_irq_regs(old_regs); |
| @@ -268,6 +269,7 @@ void smp_generic_interrupt(struct pt_regs *regs) | |||
| 268 | if (generic_interrupt_extension) | 269 | if (generic_interrupt_extension) |
| 269 | generic_interrupt_extension(); | 270 | generic_interrupt_extension(); |
| 270 | 271 | ||
| 272 | run_local_timers(); | ||
| 271 | irq_exit(); | 273 | irq_exit(); |
| 272 | 274 | ||
| 273 | set_irq_regs(old_regs); | 275 | set_irq_regs(old_regs); |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 64b838eac18c..d20009b4e6ef 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -35,7 +35,7 @@ int iommu_detected __read_mostly = 0; | |||
| 35 | 35 | ||
| 36 | /* | 36 | /* |
| 37 | * This variable becomes 1 if iommu=pt is passed on the kernel command line. | 37 | * This variable becomes 1 if iommu=pt is passed on the kernel command line. |
| 38 | * If this variable is 1, IOMMU implementations do no DMA ranslation for | 38 | * If this variable is 1, IOMMU implementations do no DMA translation for |
| 39 | * devices and allow every device to access to whole physical memory. This is | 39 | * devices and allow every device to access to whole physical memory. This is |
| 40 | * useful if a user want to use an IOMMU only for KVM device assignment to | 40 | * useful if a user want to use an IOMMU only for KVM device assignment to |
| 41 | * guests and not for driver dma translation. | 41 | * guests and not for driver dma translation. |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index ec1de97600e7..d915d956e66d 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
| @@ -198,6 +198,7 @@ void smp_reschedule_interrupt(struct pt_regs *regs) | |||
| 198 | { | 198 | { |
| 199 | ack_APIC_irq(); | 199 | ack_APIC_irq(); |
| 200 | inc_irq_stat(irq_resched_count); | 200 | inc_irq_stat(irq_resched_count); |
| 201 | run_local_timers(); | ||
| 201 | /* | 202 | /* |
| 202 | * KVM uses this interrupt to force a cpu out of guest mode | 203 | * KVM uses this interrupt to force a cpu out of guest mode |
| 203 | */ | 204 | */ |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index acd1162712b1..b1a257746a19 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -122,6 +122,7 @@ enum { | |||
| 122 | HOST_VERSION = 0x10, /* AHCI spec. version compliancy */ | 122 | HOST_VERSION = 0x10, /* AHCI spec. version compliancy */ |
| 123 | HOST_EM_LOC = 0x1c, /* Enclosure Management location */ | 123 | HOST_EM_LOC = 0x1c, /* Enclosure Management location */ |
| 124 | HOST_EM_CTL = 0x20, /* Enclosure Management Control */ | 124 | HOST_EM_CTL = 0x20, /* Enclosure Management Control */ |
| 125 | HOST_CAP2 = 0x24, /* host capabilities, extended */ | ||
| 125 | 126 | ||
| 126 | /* HOST_CTL bits */ | 127 | /* HOST_CTL bits */ |
| 127 | HOST_RESET = (1 << 0), /* reset controller; self-clear */ | 128 | HOST_RESET = (1 << 0), /* reset controller; self-clear */ |
| @@ -129,16 +130,29 @@ enum { | |||
| 129 | HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ | 130 | HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ |
| 130 | 131 | ||
| 131 | /* HOST_CAP bits */ | 132 | /* HOST_CAP bits */ |
| 133 | HOST_CAP_SXS = (1 << 5), /* Supports External SATA */ | ||
| 132 | HOST_CAP_EMS = (1 << 6), /* Enclosure Management support */ | 134 | HOST_CAP_EMS = (1 << 6), /* Enclosure Management support */ |
| 133 | HOST_CAP_SSC = (1 << 14), /* Slumber capable */ | 135 | HOST_CAP_CCC = (1 << 7), /* Command Completion Coalescing */ |
| 136 | HOST_CAP_PART = (1 << 13), /* Partial state capable */ | ||
| 137 | HOST_CAP_SSC = (1 << 14), /* Slumber state capable */ | ||
| 138 | HOST_CAP_PIO_MULTI = (1 << 15), /* PIO multiple DRQ support */ | ||
| 139 | HOST_CAP_FBS = (1 << 16), /* FIS-based switching support */ | ||
| 134 | HOST_CAP_PMP = (1 << 17), /* Port Multiplier support */ | 140 | HOST_CAP_PMP = (1 << 17), /* Port Multiplier support */ |
| 141 | HOST_CAP_ONLY = (1 << 18), /* Supports AHCI mode only */ | ||
| 135 | HOST_CAP_CLO = (1 << 24), /* Command List Override support */ | 142 | HOST_CAP_CLO = (1 << 24), /* Command List Override support */ |
| 143 | HOST_CAP_LED = (1 << 25), /* Supports activity LED */ | ||
| 136 | HOST_CAP_ALPM = (1 << 26), /* Aggressive Link PM support */ | 144 | HOST_CAP_ALPM = (1 << 26), /* Aggressive Link PM support */ |
| 137 | HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */ | 145 | HOST_CAP_SSS = (1 << 27), /* Staggered Spin-up */ |
| 146 | HOST_CAP_MPS = (1 << 28), /* Mechanical presence switch */ | ||
| 138 | HOST_CAP_SNTF = (1 << 29), /* SNotification register */ | 147 | HOST_CAP_SNTF = (1 << 29), /* SNotification register */ |
| 139 | HOST_CAP_NCQ = (1 << 30), /* Native Command Queueing */ | 148 | HOST_CAP_NCQ = (1 << 30), /* Native Command Queueing */ |
| 140 | HOST_CAP_64 = (1 << 31), /* PCI DAC (64-bit DMA) support */ | 149 | HOST_CAP_64 = (1 << 31), /* PCI DAC (64-bit DMA) support */ |
| 141 | 150 | ||
| 151 | /* HOST_CAP2 bits */ | ||
| 152 | HOST_CAP2_BOH = (1 << 0), /* BIOS/OS handoff supported */ | ||
| 153 | HOST_CAP2_NVMHCI = (1 << 1), /* NVMHCI supported */ | ||
| 154 | HOST_CAP2_APST = (1 << 2), /* Automatic partial to slumber */ | ||
| 155 | |||
| 142 | /* registers for each SATA port */ | 156 | /* registers for each SATA port */ |
| 143 | PORT_LST_ADDR = 0x00, /* command list DMA addr */ | 157 | PORT_LST_ADDR = 0x00, /* command list DMA addr */ |
| 144 | PORT_LST_ADDR_HI = 0x04, /* command list DMA addr hi */ | 158 | PORT_LST_ADDR_HI = 0x04, /* command list DMA addr hi */ |
| @@ -267,8 +281,10 @@ struct ahci_em_priv { | |||
| 267 | struct ahci_host_priv { | 281 | struct ahci_host_priv { |
| 268 | unsigned int flags; /* AHCI_HFLAG_* */ | 282 | unsigned int flags; /* AHCI_HFLAG_* */ |
| 269 | u32 cap; /* cap to use */ | 283 | u32 cap; /* cap to use */ |
| 284 | u32 cap2; /* cap2 to use */ | ||
| 270 | u32 port_map; /* port map to use */ | 285 | u32 port_map; /* port map to use */ |
| 271 | u32 saved_cap; /* saved initial cap */ | 286 | u32 saved_cap; /* saved initial cap */ |
| 287 | u32 saved_cap2; /* saved initial cap2 */ | ||
| 272 | u32 saved_port_map; /* saved initial port_map */ | 288 | u32 saved_port_map; /* saved initial port_map */ |
| 273 | u32 em_loc; /* enclosure management location */ | 289 | u32 em_loc; /* enclosure management location */ |
| 274 | }; | 290 | }; |
| @@ -331,12 +347,15 @@ static void ahci_init_sw_activity(struct ata_link *link); | |||
| 331 | 347 | ||
| 332 | static ssize_t ahci_show_host_caps(struct device *dev, | 348 | static ssize_t ahci_show_host_caps(struct device *dev, |
| 333 | struct device_attribute *attr, char *buf); | 349 | struct device_attribute *attr, char *buf); |
| 350 | static ssize_t ahci_show_host_cap2(struct device *dev, | ||
| 351 | struct device_attribute *attr, char *buf); | ||
| 334 | static ssize_t ahci_show_host_version(struct device *dev, | 352 | static ssize_t ahci_show_host_version(struct device *dev, |
| 335 | struct device_attribute *attr, char *buf); | 353 | struct device_attribute *attr, char *buf); |
| 336 | static ssize_t ahci_show_port_cmd(struct device *dev, | 354 | static ssize_t ahci_show_port_cmd(struct device *dev, |
| 337 | struct device_attribute *attr, char *buf); | 355 | struct device_attribute *attr, char *buf); |
| 338 | 356 | ||
| 339 | DEVICE_ATTR(ahci_host_caps, S_IRUGO, ahci_show_host_caps, NULL); | 357 | DEVICE_ATTR(ahci_host_caps, S_IRUGO, ahci_show_host_caps, NULL); |
| 358 | DEVICE_ATTR(ahci_host_cap2, S_IRUGO, ahci_show_host_cap2, NULL); | ||
| 340 | DEVICE_ATTR(ahci_host_version, S_IRUGO, ahci_show_host_version, NULL); | 359 | DEVICE_ATTR(ahci_host_version, S_IRUGO, ahci_show_host_version, NULL); |
| 341 | DEVICE_ATTR(ahci_port_cmd, S_IRUGO, ahci_show_port_cmd, NULL); | 360 | DEVICE_ATTR(ahci_port_cmd, S_IRUGO, ahci_show_port_cmd, NULL); |
| 342 | 361 | ||
| @@ -345,6 +364,7 @@ static struct device_attribute *ahci_shost_attrs[] = { | |||
| 345 | &dev_attr_em_message_type, | 364 | &dev_attr_em_message_type, |
| 346 | &dev_attr_em_message, | 365 | &dev_attr_em_message, |
| 347 | &dev_attr_ahci_host_caps, | 366 | &dev_attr_ahci_host_caps, |
| 367 | &dev_attr_ahci_host_cap2, | ||
| 348 | &dev_attr_ahci_host_version, | 368 | &dev_attr_ahci_host_version, |
| 349 | &dev_attr_ahci_port_cmd, | 369 | &dev_attr_ahci_port_cmd, |
| 350 | NULL | 370 | NULL |
| @@ -447,7 +467,8 @@ static const struct ata_port_info ahci_port_info[] = { | |||
| 447 | [board_ahci_sb600] = | 467 | [board_ahci_sb600] = |
| 448 | { | 468 | { |
| 449 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | | 469 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | |
| 450 | AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255), | 470 | AHCI_HFLAG_NO_MSI | AHCI_HFLAG_SECT255 | |
| 471 | AHCI_HFLAG_32BIT_ONLY), | ||
| 451 | .flags = AHCI_FLAG_COMMON, | 472 | .flags = AHCI_FLAG_COMMON, |
| 452 | .pio_mask = ATA_PIO4, | 473 | .pio_mask = ATA_PIO4, |
| 453 | .udma_mask = ATA_UDMA6, | 474 | .udma_mask = ATA_UDMA6, |
| @@ -732,6 +753,16 @@ static ssize_t ahci_show_host_caps(struct device *dev, | |||
| 732 | return sprintf(buf, "%x\n", hpriv->cap); | 753 | return sprintf(buf, "%x\n", hpriv->cap); |
| 733 | } | 754 | } |
| 734 | 755 | ||
| 756 | static ssize_t ahci_show_host_cap2(struct device *dev, | ||
| 757 | struct device_attribute *attr, char *buf) | ||
| 758 | { | ||
| 759 | struct Scsi_Host *shost = class_to_shost(dev); | ||
| 760 | struct ata_port *ap = ata_shost_to_port(shost); | ||
| 761 | struct ahci_host_priv *hpriv = ap->host->private_data; | ||
| 762 | |||
| 763 | return sprintf(buf, "%x\n", hpriv->cap2); | ||
| 764 | } | ||
| 765 | |||
| 735 | static ssize_t ahci_show_host_version(struct device *dev, | 766 | static ssize_t ahci_show_host_version(struct device *dev, |
| 736 | struct device_attribute *attr, char *buf) | 767 | struct device_attribute *attr, char *buf) |
| 737 | { | 768 | { |
| @@ -771,7 +802,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
| 771 | struct ahci_host_priv *hpriv) | 802 | struct ahci_host_priv *hpriv) |
| 772 | { | 803 | { |
| 773 | void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; | 804 | void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; |
| 774 | u32 cap, port_map; | 805 | u32 cap, cap2, vers, port_map; |
| 775 | int i; | 806 | int i; |
| 776 | int mv; | 807 | int mv; |
| 777 | 808 | ||
| @@ -784,6 +815,14 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
| 784 | hpriv->saved_cap = cap = readl(mmio + HOST_CAP); | 815 | hpriv->saved_cap = cap = readl(mmio + HOST_CAP); |
| 785 | hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL); | 816 | hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL); |
| 786 | 817 | ||
| 818 | /* CAP2 register is only defined for AHCI 1.2 and later */ | ||
| 819 | vers = readl(mmio + HOST_VERSION); | ||
| 820 | if ((vers >> 16) > 1 || | ||
| 821 | ((vers >> 16) == 1 && (vers & 0xFFFF) >= 0x200)) | ||
| 822 | hpriv->saved_cap2 = cap2 = readl(mmio + HOST_CAP2); | ||
| 823 | else | ||
| 824 | hpriv->saved_cap2 = cap2 = 0; | ||
| 825 | |||
| 787 | /* some chips have errata preventing 64bit use */ | 826 | /* some chips have errata preventing 64bit use */ |
| 788 | if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) { | 827 | if ((cap & HOST_CAP_64) && (hpriv->flags & AHCI_HFLAG_32BIT_ONLY)) { |
| 789 | dev_printk(KERN_INFO, &pdev->dev, | 828 | dev_printk(KERN_INFO, &pdev->dev, |
| @@ -869,6 +908,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
| 869 | 908 | ||
| 870 | /* record values to use during operation */ | 909 | /* record values to use during operation */ |
| 871 | hpriv->cap = cap; | 910 | hpriv->cap = cap; |
| 911 | hpriv->cap2 = cap2; | ||
| 872 | hpriv->port_map = port_map; | 912 | hpriv->port_map = port_map; |
| 873 | } | 913 | } |
| 874 | 914 | ||
| @@ -887,6 +927,8 @@ static void ahci_restore_initial_config(struct ata_host *host) | |||
| 887 | void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; | 927 | void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; |
| 888 | 928 | ||
| 889 | writel(hpriv->saved_cap, mmio + HOST_CAP); | 929 | writel(hpriv->saved_cap, mmio + HOST_CAP); |
| 930 | if (hpriv->saved_cap2) | ||
| 931 | writel(hpriv->saved_cap2, mmio + HOST_CAP2); | ||
| 890 | writel(hpriv->saved_port_map, mmio + HOST_PORTS_IMPL); | 932 | writel(hpriv->saved_port_map, mmio + HOST_PORTS_IMPL); |
| 891 | (void) readl(mmio + HOST_PORTS_IMPL); /* flush */ | 933 | (void) readl(mmio + HOST_PORTS_IMPL); /* flush */ |
| 892 | } | 934 | } |
| @@ -2534,13 +2576,14 @@ static void ahci_print_info(struct ata_host *host) | |||
| 2534 | struct ahci_host_priv *hpriv = host->private_data; | 2576 | struct ahci_host_priv *hpriv = host->private_data; |
| 2535 | struct pci_dev *pdev = to_pci_dev(host->dev); | 2577 | struct pci_dev *pdev = to_pci_dev(host->dev); |
| 2536 | void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; | 2578 | void __iomem *mmio = host->iomap[AHCI_PCI_BAR]; |
| 2537 | u32 vers, cap, impl, speed; | 2579 | u32 vers, cap, cap2, impl, speed; |
| 2538 | const char *speed_s; | 2580 | const char *speed_s; |
| 2539 | u16 cc; | 2581 | u16 cc; |
| 2540 | const char *scc_s; | 2582 | const char *scc_s; |
| 2541 | 2583 | ||
| 2542 | vers = readl(mmio + HOST_VERSION); | 2584 | vers = readl(mmio + HOST_VERSION); |
| 2543 | cap = hpriv->cap; | 2585 | cap = hpriv->cap; |
| 2586 | cap2 = hpriv->cap2; | ||
| 2544 | impl = hpriv->port_map; | 2587 | impl = hpriv->port_map; |
| 2545 | 2588 | ||
| 2546 | speed = (cap >> 20) & 0xf; | 2589 | speed = (cap >> 20) & 0xf; |
| @@ -2583,25 +2626,29 @@ static void ahci_print_info(struct ata_host *host) | |||
| 2583 | "flags: " | 2626 | "flags: " |
| 2584 | "%s%s%s%s%s%s%s" | 2627 | "%s%s%s%s%s%s%s" |
| 2585 | "%s%s%s%s%s%s%s" | 2628 | "%s%s%s%s%s%s%s" |
| 2586 | "%s\n" | 2629 | "%s%s%s%s%s%s\n" |
| 2587 | , | 2630 | , |
| 2588 | 2631 | ||
| 2589 | cap & (1 << 31) ? "64bit " : "", | 2632 | cap & HOST_CAP_64 ? "64bit " : "", |
| 2590 | cap & (1 << 30) ? "ncq " : "", | 2633 | cap & HOST_CAP_NCQ ? "ncq " : "", |
| 2591 | cap & (1 << 29) ? "sntf " : "", | 2634 | cap & HOST_CAP_SNTF ? "sntf " : "", |
| 2592 | cap & (1 << 28) ? "ilck " : "", | 2635 | cap & HOST_CAP_MPS ? "ilck " : "", |
| 2593 | cap & (1 << 27) ? "stag " : "", | 2636 | cap & HOST_CAP_SSS ? "stag " : "", |
| 2594 | cap & (1 << 26) ? "pm " : "", | 2637 | cap & HOST_CAP_ALPM ? "pm " : "", |
| 2595 | cap & (1 << 25) ? "led " : "", | 2638 | cap & HOST_CAP_LED ? "led " : "", |
| 2596 | 2639 | cap & HOST_CAP_CLO ? "clo " : "", | |
| 2597 | cap & (1 << 24) ? "clo " : "", | 2640 | cap & HOST_CAP_ONLY ? "only " : "", |
| 2598 | cap & (1 << 19) ? "nz " : "", | 2641 | cap & HOST_CAP_PMP ? "pmp " : "", |
| 2599 | cap & (1 << 18) ? "only " : "", | 2642 | cap & HOST_CAP_FBS ? "fbs " : "", |
| 2600 | cap & (1 << 17) ? "pmp " : "", | 2643 | cap & HOST_CAP_PIO_MULTI ? "pio " : "", |
| 2601 | cap & (1 << 15) ? "pio " : "", | 2644 | cap & HOST_CAP_SSC ? "slum " : "", |
| 2602 | cap & (1 << 14) ? "slum " : "", | 2645 | cap & HOST_CAP_PART ? "part " : "", |
| 2603 | cap & (1 << 13) ? "part " : "", | 2646 | cap & HOST_CAP_CCC ? "ccc " : "", |
| 2604 | cap & (1 << 6) ? "ems ": "" | 2647 | cap & HOST_CAP_EMS ? "ems " : "", |
| 2648 | cap & HOST_CAP_SXS ? "sxs " : "", | ||
| 2649 | cap2 & HOST_CAP2_APST ? "apst " : "", | ||
| 2650 | cap2 & HOST_CAP2_NVMHCI ? "nvmp " : "", | ||
| 2651 | cap2 & HOST_CAP2_BOH ? "boh " : "" | ||
| 2605 | ); | 2652 | ); |
| 2606 | } | 2653 | } |
| 2607 | 2654 | ||
| @@ -2650,17 +2697,15 @@ static void ahci_p5wdh_workaround(struct ata_host *host) | |||
| 2650 | } | 2697 | } |
| 2651 | } | 2698 | } |
| 2652 | 2699 | ||
| 2653 | /* | 2700 | /* only some SB600 ahci controllers can do 64bit DMA */ |
| 2654 | * SB600 ahci controller on certain boards can't do 64bit DMA with | 2701 | static bool ahci_sb600_enable_64bit(struct pci_dev *pdev) |
| 2655 | * older BIOS. | ||
| 2656 | */ | ||
| 2657 | static bool ahci_sb600_32bit_only(struct pci_dev *pdev) | ||
| 2658 | { | 2702 | { |
| 2659 | static const struct dmi_system_id sysids[] = { | 2703 | static const struct dmi_system_id sysids[] = { |
| 2660 | /* | 2704 | /* |
| 2661 | * The oldest version known to be broken is 0901 and | 2705 | * The oldest version known to be broken is 0901 and |
| 2662 | * working is 1501 which was released on 2007-10-26. | 2706 | * working is 1501 which was released on 2007-10-26. |
| 2663 | * Force 32bit DMA on anything older than 1501. | 2707 | * Enable 64bit DMA on 1501 and anything newer. |
| 2708 | * | ||
| 2664 | * Please read bko#9412 for more info. | 2709 | * Please read bko#9412 for more info. |
| 2665 | */ | 2710 | */ |
| 2666 | { | 2711 | { |
| @@ -2672,48 +2717,29 @@ static bool ahci_sb600_32bit_only(struct pci_dev *pdev) | |||
| 2672 | }, | 2717 | }, |
| 2673 | .driver_data = "20071026", /* yyyymmdd */ | 2718 | .driver_data = "20071026", /* yyyymmdd */ |
| 2674 | }, | 2719 | }, |
| 2675 | /* | ||
| 2676 | * It's yet unknown whether more recent BIOS fixes the | ||
| 2677 | * problem. Blacklist the whole board for the time | ||
| 2678 | * being. Please read the following thread for more | ||
| 2679 | * info. | ||
| 2680 | * | ||
| 2681 | * http://thread.gmane.org/gmane.linux.ide/42326 | ||
| 2682 | */ | ||
| 2683 | { | ||
| 2684 | .ident = "Gigabyte GA-MA69VM-S2", | ||
| 2685 | .matches = { | ||
| 2686 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
| 2687 | "Gigabyte Technology Co., Ltd."), | ||
| 2688 | DMI_MATCH(DMI_BOARD_NAME, "GA-MA69VM-S2"), | ||
| 2689 | }, | ||
| 2690 | }, | ||
| 2691 | { } | 2720 | { } |
| 2692 | }; | 2721 | }; |
| 2693 | const struct dmi_system_id *match; | 2722 | const struct dmi_system_id *match; |
| 2723 | int year, month, date; | ||
| 2724 | char buf[9]; | ||
| 2694 | 2725 | ||
| 2695 | match = dmi_first_match(sysids); | 2726 | match = dmi_first_match(sysids); |
| 2696 | if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) || | 2727 | if (pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x12, 0) || |
| 2697 | !match) | 2728 | !match) |
| 2698 | return false; | 2729 | return false; |
| 2699 | 2730 | ||
| 2700 | if (match->driver_data) { | 2731 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); |
| 2701 | int year, month, date; | 2732 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); |
| 2702 | char buf[9]; | ||
| 2703 | |||
| 2704 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); | ||
| 2705 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); | ||
| 2706 | |||
| 2707 | if (strcmp(buf, match->driver_data) >= 0) | ||
| 2708 | return false; | ||
| 2709 | 2733 | ||
| 2734 | if (strcmp(buf, match->driver_data) >= 0) { | ||
| 2735 | dev_printk(KERN_WARNING, &pdev->dev, "%s: enabling 64bit DMA\n", | ||
| 2736 | match->ident); | ||
| 2737 | return true; | ||
| 2738 | } else { | ||
| 2710 | dev_printk(KERN_WARNING, &pdev->dev, "%s: BIOS too old, " | 2739 | dev_printk(KERN_WARNING, &pdev->dev, "%s: BIOS too old, " |
| 2711 | "forcing 32bit DMA, update BIOS\n", match->ident); | 2740 | "forcing 32bit DMA, update BIOS\n", match->ident); |
| 2712 | } else | 2741 | return false; |
| 2713 | dev_printk(KERN_WARNING, &pdev->dev, "%s: this board can't " | 2742 | } |
| 2714 | "do 64bit DMA, forcing 32bit\n", match->ident); | ||
| 2715 | |||
| 2716 | return true; | ||
| 2717 | } | 2743 | } |
| 2718 | 2744 | ||
| 2719 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) | 2745 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) |
| @@ -2858,6 +2884,55 @@ static bool ahci_broken_online(struct pci_dev *pdev) | |||
| 2858 | return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff); | 2884 | return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff); |
| 2859 | } | 2885 | } |
| 2860 | 2886 | ||
| 2887 | #ifdef CONFIG_ATA_ACPI | ||
| 2888 | static void ahci_gtf_filter_workaround(struct ata_host *host) | ||
| 2889 | { | ||
| 2890 | static const struct dmi_system_id sysids[] = { | ||
| 2891 | /* | ||
| 2892 | * Aspire 3810T issues a bunch of SATA enable commands | ||
| 2893 | * via _GTF including an invalid one and one which is | ||
| 2894 | * rejected by the device. Among the successful ones | ||
| 2895 | * is FPDMA non-zero offset enable which when enabled | ||
| 2896 | * only on the drive side leads to NCQ command | ||
| 2897 | * failures. Filter it out. | ||
| 2898 | */ | ||
| 2899 | { | ||
| 2900 | .ident = "Aspire 3810T", | ||
| 2901 | .matches = { | ||
| 2902 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
| 2903 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3810T"), | ||
| 2904 | }, | ||
| 2905 | .driver_data = (void *)ATA_ACPI_FILTER_FPDMA_OFFSET, | ||
| 2906 | }, | ||
| 2907 | { } | ||
| 2908 | }; | ||
| 2909 | const struct dmi_system_id *dmi = dmi_first_match(sysids); | ||
| 2910 | unsigned int filter; | ||
| 2911 | int i; | ||
| 2912 | |||
| 2913 | if (!dmi) | ||
| 2914 | return; | ||
| 2915 | |||
| 2916 | filter = (unsigned long)dmi->driver_data; | ||
| 2917 | dev_printk(KERN_INFO, host->dev, | ||
| 2918 | "applying extra ACPI _GTF filter 0x%x for %s\n", | ||
| 2919 | filter, dmi->ident); | ||
| 2920 | |||
| 2921 | for (i = 0; i < host->n_ports; i++) { | ||
| 2922 | struct ata_port *ap = host->ports[i]; | ||
| 2923 | struct ata_link *link; | ||
| 2924 | struct ata_device *dev; | ||
| 2925 | |||
| 2926 | ata_for_each_link(link, ap, EDGE) | ||
| 2927 | ata_for_each_dev(dev, link, ALL) | ||
| 2928 | dev->gtf_filter |= filter; | ||
| 2929 | } | ||
| 2930 | } | ||
| 2931 | #else | ||
| 2932 | static inline void ahci_gtf_filter_workaround(struct ata_host *host) | ||
| 2933 | {} | ||
| 2934 | #endif | ||
| 2935 | |||
| 2861 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 2936 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 2862 | { | 2937 | { |
| 2863 | static int printed_version; | 2938 | static int printed_version; |
| @@ -2926,9 +3001,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2926 | if (board_id == board_ahci_sb700 && pdev->revision >= 0x40) | 3001 | if (board_id == board_ahci_sb700 && pdev->revision >= 0x40) |
| 2927 | hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL; | 3002 | hpriv->flags &= ~AHCI_HFLAG_IGN_SERR_INTERNAL; |
| 2928 | 3003 | ||
| 2929 | /* apply sb600 32bit only quirk */ | 3004 | /* only some SB600s can do 64bit DMA */ |
| 2930 | if (ahci_sb600_32bit_only(pdev)) | 3005 | if (ahci_sb600_enable_64bit(pdev)) |
| 2931 | hpriv->flags |= AHCI_HFLAG_32BIT_ONLY; | 3006 | hpriv->flags &= ~AHCI_HFLAG_32BIT_ONLY; |
| 2932 | 3007 | ||
| 2933 | if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) | 3008 | if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) |
| 2934 | pci_intx(pdev, 1); | 3009 | pci_intx(pdev, 1); |
| @@ -3023,6 +3098,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 3023 | /* apply workaround for ASUS P5W DH Deluxe mainboard */ | 3098 | /* apply workaround for ASUS P5W DH Deluxe mainboard */ |
| 3024 | ahci_p5wdh_workaround(host); | 3099 | ahci_p5wdh_workaround(host); |
| 3025 | 3100 | ||
| 3101 | /* apply gtf filter quirk */ | ||
| 3102 | ahci_gtf_filter_workaround(host); | ||
| 3103 | |||
| 3026 | /* initialize adapter */ | 3104 | /* initialize adapter */ |
| 3027 | rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64); | 3105 | rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64); |
| 3028 | if (rc) | 3106 | if (rc) |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 01964b6e6f6b..b0882cddfd4c 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -20,19 +20,9 @@ | |||
| 20 | 20 | ||
| 21 | #include <acpi/acpi_bus.h> | 21 | #include <acpi/acpi_bus.h> |
| 22 | 22 | ||
| 23 | enum { | 23 | unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; |
| 24 | ATA_ACPI_FILTER_SETXFER = 1 << 0, | ||
| 25 | ATA_ACPI_FILTER_LOCK = 1 << 1, | ||
| 26 | ATA_ACPI_FILTER_DIPM = 1 << 2, | ||
| 27 | |||
| 28 | ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER | | ||
| 29 | ATA_ACPI_FILTER_LOCK | | ||
| 30 | ATA_ACPI_FILTER_DIPM, | ||
| 31 | }; | ||
| 32 | |||
| 33 | static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; | ||
| 34 | module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); | 24 | module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); |
| 35 | MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM)"); | 25 | MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM, 0x8=FPDMA non-zero offset, 0x10=FPDMA DMA Setup FIS auto-activate)"); |
| 36 | 26 | ||
| 37 | #define NO_PORT_MULT 0xffff | 27 | #define NO_PORT_MULT 0xffff |
| 38 | #define SATA_ADR(root, pmp) (((root) << 16) | (pmp)) | 28 | #define SATA_ADR(root, pmp) (((root) << 16) | (pmp)) |
| @@ -613,10 +603,11 @@ static void ata_acpi_gtf_to_tf(struct ata_device *dev, | |||
| 613 | tf->command = gtf->tf[6]; /* 0x1f7 */ | 603 | tf->command = gtf->tf[6]; /* 0x1f7 */ |
| 614 | } | 604 | } |
| 615 | 605 | ||
| 616 | static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | 606 | static int ata_acpi_filter_tf(struct ata_device *dev, |
| 607 | const struct ata_taskfile *tf, | ||
| 617 | const struct ata_taskfile *ptf) | 608 | const struct ata_taskfile *ptf) |
| 618 | { | 609 | { |
| 619 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_SETXFER) { | 610 | if (dev->gtf_filter & ATA_ACPI_FILTER_SETXFER) { |
| 620 | /* libata doesn't use ACPI to configure transfer mode. | 611 | /* libata doesn't use ACPI to configure transfer mode. |
| 621 | * It will only confuse device configuration. Skip. | 612 | * It will only confuse device configuration. Skip. |
| 622 | */ | 613 | */ |
| @@ -625,7 +616,7 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | |||
| 625 | return 1; | 616 | return 1; |
| 626 | } | 617 | } |
| 627 | 618 | ||
| 628 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_LOCK) { | 619 | if (dev->gtf_filter & ATA_ACPI_FILTER_LOCK) { |
| 629 | /* BIOS writers, sorry but we don't wanna lock | 620 | /* BIOS writers, sorry but we don't wanna lock |
| 630 | * features unless the user explicitly said so. | 621 | * features unless the user explicitly said so. |
| 631 | */ | 622 | */ |
| @@ -647,12 +638,23 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | |||
| 647 | return 1; | 638 | return 1; |
| 648 | } | 639 | } |
| 649 | 640 | ||
| 650 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_DIPM) { | 641 | if (tf->command == ATA_CMD_SET_FEATURES && |
| 642 | tf->feature == SETFEATURES_SATA_ENABLE) { | ||
| 651 | /* inhibit enabling DIPM */ | 643 | /* inhibit enabling DIPM */ |
| 652 | if (tf->command == ATA_CMD_SET_FEATURES && | 644 | if (dev->gtf_filter & ATA_ACPI_FILTER_DIPM && |
| 653 | tf->feature == SETFEATURES_SATA_ENABLE && | ||
| 654 | tf->nsect == SATA_DIPM) | 645 | tf->nsect == SATA_DIPM) |
| 655 | return 1; | 646 | return 1; |
| 647 | |||
| 648 | /* inhibit FPDMA non-zero offset */ | ||
| 649 | if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_OFFSET && | ||
| 650 | (tf->nsect == SATA_FPDMA_OFFSET || | ||
| 651 | tf->nsect == SATA_FPDMA_IN_ORDER)) | ||
| 652 | return 1; | ||
| 653 | |||
| 654 | /* inhibit FPDMA auto activation */ | ||
| 655 | if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_AA && | ||
| 656 | tf->nsect == SATA_FPDMA_AA) | ||
| 657 | return 1; | ||
| 656 | } | 658 | } |
| 657 | 659 | ||
| 658 | return 0; | 660 | return 0; |
| @@ -704,7 +706,7 @@ static int ata_acpi_run_tf(struct ata_device *dev, | |||
| 704 | pptf = &ptf; | 706 | pptf = &ptf; |
| 705 | } | 707 | } |
| 706 | 708 | ||
| 707 | if (!ata_acpi_filter_tf(&tf, pptf)) { | 709 | if (!ata_acpi_filter_tf(dev, &tf, pptf)) { |
| 708 | rtf = tf; | 710 | rtf = tf; |
| 709 | err_mask = ata_exec_internal(dev, &rtf, NULL, | 711 | err_mask = ata_exec_internal(dev, &rtf, NULL, |
| 710 | DMA_NONE, NULL, 0, 0); | 712 | DMA_NONE, NULL, 0, 0); |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 0ddaf43d68c6..b525a0981348 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -5591,6 +5591,9 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp) | |||
| 5591 | 5591 | ||
| 5592 | dev->link = link; | 5592 | dev->link = link; |
| 5593 | dev->devno = dev - link->device; | 5593 | dev->devno = dev - link->device; |
| 5594 | #ifdef CONFIG_ATA_ACPI | ||
| 5595 | dev->gtf_filter = ata_acpi_gtf_filter; | ||
| 5596 | #endif | ||
| 5594 | ata_dev_init(dev); | 5597 | ata_dev_init(dev); |
| 5595 | } | 5598 | } |
| 5596 | } | 5599 | } |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index a04488f0de88..0a97822da211 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -2667,14 +2667,14 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2667 | dev->pio_mode = XFER_PIO_0; | 2667 | dev->pio_mode = XFER_PIO_0; |
| 2668 | dev->flags &= ~ATA_DFLAG_SLEEPING; | 2668 | dev->flags &= ~ATA_DFLAG_SLEEPING; |
| 2669 | 2669 | ||
| 2670 | if (!ata_phys_link_offline(ata_dev_phys_link(dev))) { | 2670 | if (ata_phys_link_offline(ata_dev_phys_link(dev))) |
| 2671 | /* apply class override */ | 2671 | continue; |
| 2672 | if (lflags & ATA_LFLAG_ASSUME_ATA) | 2672 | |
| 2673 | classes[dev->devno] = ATA_DEV_ATA; | 2673 | /* apply class override */ |
| 2674 | else if (lflags & ATA_LFLAG_ASSUME_SEMB) | 2674 | if (lflags & ATA_LFLAG_ASSUME_ATA) |
| 2675 | classes[dev->devno] = ATA_DEV_SEMB_UNSUP; | 2675 | classes[dev->devno] = ATA_DEV_ATA; |
| 2676 | } else | 2676 | else if (lflags & ATA_LFLAG_ASSUME_SEMB) |
| 2677 | classes[dev->devno] = ATA_DEV_NONE; | 2677 | classes[dev->devno] = ATA_DEV_SEMB_UNSUP; |
| 2678 | } | 2678 | } |
| 2679 | 2679 | ||
| 2680 | /* record current link speed */ | 2680 | /* record current link speed */ |
| @@ -2713,34 +2713,48 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
| 2713 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; | 2713 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; |
| 2714 | spin_unlock_irqrestore(link->ap->lock, flags); | 2714 | spin_unlock_irqrestore(link->ap->lock, flags); |
| 2715 | 2715 | ||
| 2716 | /* Make sure onlineness and classification result correspond. | 2716 | /* |
| 2717 | * Make sure onlineness and classification result correspond. | ||
| 2717 | * Hotplug could have happened during reset and some | 2718 | * Hotplug could have happened during reset and some |
| 2718 | * controllers fail to wait while a drive is spinning up after | 2719 | * controllers fail to wait while a drive is spinning up after |
| 2719 | * being hotplugged causing misdetection. By cross checking | 2720 | * being hotplugged causing misdetection. By cross checking |
| 2720 | * link onlineness and classification result, those conditions | 2721 | * link on/offlineness and classification result, those |
| 2721 | * can be reliably detected and retried. | 2722 | * conditions can be reliably detected and retried. |
| 2722 | */ | 2723 | */ |
| 2723 | nr_unknown = 0; | 2724 | nr_unknown = 0; |
| 2724 | ata_for_each_dev(dev, link, ALL) { | 2725 | ata_for_each_dev(dev, link, ALL) { |
| 2725 | /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */ | 2726 | if (ata_phys_link_online(ata_dev_phys_link(dev))) { |
| 2726 | if (classes[dev->devno] == ATA_DEV_UNKNOWN) { | 2727 | if (classes[dev->devno] == ATA_DEV_UNKNOWN) { |
| 2727 | classes[dev->devno] = ATA_DEV_NONE; | 2728 | ata_dev_printk(dev, KERN_DEBUG, "link online " |
| 2728 | if (ata_phys_link_online(ata_dev_phys_link(dev))) | 2729 | "but device misclassifed\n"); |
| 2730 | classes[dev->devno] = ATA_DEV_NONE; | ||
| 2729 | nr_unknown++; | 2731 | nr_unknown++; |
| 2732 | } | ||
| 2733 | } else if (ata_phys_link_offline(ata_dev_phys_link(dev))) { | ||
| 2734 | if (ata_class_enabled(classes[dev->devno])) | ||
| 2735 | ata_dev_printk(dev, KERN_DEBUG, "link offline, " | ||
| 2736 | "clearing class %d to NONE\n", | ||
| 2737 | classes[dev->devno]); | ||
| 2738 | classes[dev->devno] = ATA_DEV_NONE; | ||
| 2739 | } else if (classes[dev->devno] == ATA_DEV_UNKNOWN) { | ||
| 2740 | ata_dev_printk(dev, KERN_DEBUG, "link status unknown, " | ||
| 2741 | "clearing UNKNOWN to NONE\n"); | ||
| 2742 | classes[dev->devno] = ATA_DEV_NONE; | ||
| 2730 | } | 2743 | } |
| 2731 | } | 2744 | } |
| 2732 | 2745 | ||
| 2733 | if (classify && nr_unknown) { | 2746 | if (classify && nr_unknown) { |
| 2734 | if (try < max_tries) { | 2747 | if (try < max_tries) { |
| 2735 | ata_link_printk(link, KERN_WARNING, "link online but " | 2748 | ata_link_printk(link, KERN_WARNING, "link online but " |
| 2736 | "device misclassified, retrying\n"); | 2749 | "%d devices misclassified, retrying\n", |
| 2750 | nr_unknown); | ||
| 2737 | failed_link = link; | 2751 | failed_link = link; |
| 2738 | rc = -EAGAIN; | 2752 | rc = -EAGAIN; |
| 2739 | goto fail; | 2753 | goto fail; |
| 2740 | } | 2754 | } |
| 2741 | ata_link_printk(link, KERN_WARNING, | 2755 | ata_link_printk(link, KERN_WARNING, |
| 2742 | "link online but device misclassified, " | 2756 | "link online but %d devices misclassified, " |
| 2743 | "device detection might fail\n"); | 2757 | "device detection might fail\n", nr_unknown); |
| 2744 | } | 2758 | } |
| 2745 | 2759 | ||
| 2746 | /* reset successful, schedule revalidation */ | 2760 | /* reset successful, schedule revalidation */ |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index be8e2628f82c..823e63096362 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
| @@ -118,6 +118,8 @@ extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm); | |||
| 118 | 118 | ||
| 119 | /* libata-acpi.c */ | 119 | /* libata-acpi.c */ |
| 120 | #ifdef CONFIG_ATA_ACPI | 120 | #ifdef CONFIG_ATA_ACPI |
| 121 | extern unsigned int ata_acpi_gtf_filter; | ||
| 122 | |||
| 121 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); | 123 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); |
| 122 | extern void ata_acpi_associate(struct ata_host *host); | 124 | extern void ata_acpi_associate(struct ata_host *host); |
| 123 | extern void ata_acpi_dissociate(struct ata_host *host); | 125 | extern void ata_acpi_dissociate(struct ata_host *host); |
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c index fc9c5d6d7d80..1432dc9d0ab8 100644 --- a/drivers/ata/pata_ali.c +++ b/drivers/ata/pata_ali.c | |||
| @@ -290,7 +290,7 @@ static void ali_warn_atapi_dma(struct ata_device *adev) | |||
| 290 | 290 | ||
| 291 | if (print_info && adev->class == ATA_DEV_ATAPI && !ali_atapi_dma) { | 291 | if (print_info && adev->class == ATA_DEV_ATAPI && !ali_atapi_dma) { |
| 292 | ata_dev_printk(adev, KERN_WARNING, | 292 | ata_dev_printk(adev, KERN_WARNING, |
| 293 | "WARNING: ATAPI DMA disabled for reliablity issues. It can be enabled\n"); | 293 | "WARNING: ATAPI DMA disabled for reliability issues. It can be enabled\n"); |
| 294 | ata_dev_printk(adev, KERN_WARNING, | 294 | ata_dev_printk(adev, KERN_WARNING, |
| 295 | "WARNING: via pata_ali.atapi_dma modparam or corresponding sysfs node.\n"); | 295 | "WARNING: via pata_ali.atapi_dma modparam or corresponding sysfs node.\n"); |
| 296 | } | 296 | } |
diff --git a/drivers/ata/pata_atp867x.c b/drivers/ata/pata_atp867x.c index 7990de925d2e..6fe7ded40c6a 100644 --- a/drivers/ata/pata_atp867x.c +++ b/drivers/ata/pata_atp867x.c | |||
| @@ -118,20 +118,13 @@ struct atp867x_priv { | |||
| 118 | int pci66mhz; | 118 | int pci66mhz; |
| 119 | }; | 119 | }; |
| 120 | 120 | ||
| 121 | static inline u8 atp867x_speed_to_mode(u8 speed) | ||
| 122 | { | ||
| 123 | return speed - XFER_UDMA_0 + 1; | ||
| 124 | } | ||
| 125 | |||
| 126 | static void atp867x_set_dmamode(struct ata_port *ap, struct ata_device *adev) | 121 | static void atp867x_set_dmamode(struct ata_port *ap, struct ata_device *adev) |
| 127 | { | 122 | { |
| 128 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 123 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 129 | struct atp867x_priv *dp = ap->private_data; | 124 | struct atp867x_priv *dp = ap->private_data; |
| 130 | u8 speed = adev->dma_mode; | 125 | u8 speed = adev->dma_mode; |
| 131 | u8 b; | 126 | u8 b; |
| 132 | u8 mode; | 127 | u8 mode = speed - XFER_UDMA_0 + 1; |
| 133 | |||
| 134 | mode = atp867x_speed_to_mode(speed); | ||
| 135 | 128 | ||
| 136 | /* | 129 | /* |
| 137 | * Doc 6.6.9: decrease the udma mode value by 1 for safer UDMA speed | 130 | * Doc 6.6.9: decrease the udma mode value by 1 for safer UDMA speed |
| @@ -156,25 +149,38 @@ static void atp867x_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
| 156 | iowrite8(b, dp->dma_mode); | 149 | iowrite8(b, dp->dma_mode); |
| 157 | } | 150 | } |
| 158 | 151 | ||
| 159 | static int atp867x_get_active_clocks_shifted(unsigned int clk) | 152 | static int atp867x_get_active_clocks_shifted(struct ata_port *ap, |
| 153 | unsigned int clk) | ||
| 160 | { | 154 | { |
| 155 | struct atp867x_priv *dp = ap->private_data; | ||
| 161 | unsigned char clocks = clk; | 156 | unsigned char clocks = clk; |
| 162 | 157 | ||
| 158 | /* | ||
| 159 | * Doc 6.6.9: increase the clock value by 1 for safer PIO speed | ||
| 160 | * on 66MHz bus | ||
| 161 | */ | ||
| 162 | if (dp->pci66mhz) | ||
| 163 | clocks++; | ||
| 164 | |||
| 163 | switch (clocks) { | 165 | switch (clocks) { |
| 164 | case 0: | 166 | case 0: |
| 165 | clocks = 1; | 167 | clocks = 1; |
| 166 | break; | 168 | break; |
| 167 | case 1 ... 7: | 169 | case 1 ... 6: |
| 168 | break; | ||
| 169 | case 8 ... 12: | ||
| 170 | clocks = 7; | ||
| 171 | break; | 170 | break; |
| 172 | default: | 171 | default: |
| 173 | printk(KERN_WARNING "ATP867X: active %dclk is invalid. " | 172 | printk(KERN_WARNING "ATP867X: active %dclk is invalid. " |
| 174 | "Using default 8clk.\n", clk); | 173 | "Using 12clk.\n", clk); |
| 175 | clocks = 0; /* 8 clk */ | 174 | case 9 ... 12: |
| 175 | clocks = 7; /* 12 clk */ | ||
| 176 | break; | 176 | break; |
| 177 | case 7: | ||
| 178 | case 8: /* default 8 clk */ | ||
| 179 | clocks = 0; | ||
| 180 | goto active_clock_shift_done; | ||
| 177 | } | 181 | } |
| 182 | |||
| 183 | active_clock_shift_done: | ||
| 178 | return clocks << ATP867X_IO_PIOSPD_ACTIVE_SHIFT; | 184 | return clocks << ATP867X_IO_PIOSPD_ACTIVE_SHIFT; |
| 179 | } | 185 | } |
| 180 | 186 | ||
| @@ -188,20 +194,20 @@ static int atp867x_get_recover_clocks_shifted(unsigned int clk) | |||
| 188 | break; | 194 | break; |
| 189 | case 1 ... 11: | 195 | case 1 ... 11: |
| 190 | break; | 196 | break; |
| 191 | case 12: | 197 | case 13: |
| 192 | clocks = 0; | 198 | case 14: |
| 193 | break; | 199 | --clocks; /* by the spec */ |
| 194 | case 13: case 14: | ||
| 195 | --clocks; | ||
| 196 | break; | 200 | break; |
| 197 | case 15: | 201 | case 15: |
| 198 | break; | 202 | break; |
| 199 | default: | 203 | default: |
| 200 | printk(KERN_WARNING "ATP867X: recover %dclk is invalid. " | 204 | printk(KERN_WARNING "ATP867X: recover %dclk is invalid. " |
| 201 | "Using default 15clk.\n", clk); | 205 | "Using default 12clk.\n", clk); |
| 202 | clocks = 0; /* 12 clk */ | 206 | case 12: /* default 12 clk */ |
| 207 | clocks = 0; | ||
| 203 | break; | 208 | break; |
| 204 | } | 209 | } |
| 210 | |||
| 205 | return clocks << ATP867X_IO_PIOSPD_RECOVER_SHIFT; | 211 | return clocks << ATP867X_IO_PIOSPD_RECOVER_SHIFT; |
| 206 | } | 212 | } |
| 207 | 213 | ||
| @@ -230,25 +236,38 @@ static void atp867x_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 230 | b = (b & ~ATP867X_IO_DMAMODE_MSTR_MASK); | 236 | b = (b & ~ATP867X_IO_DMAMODE_MSTR_MASK); |
| 231 | iowrite8(b, dp->dma_mode); | 237 | iowrite8(b, dp->dma_mode); |
| 232 | 238 | ||
| 233 | b = atp867x_get_active_clocks_shifted(t.active) | | 239 | b = atp867x_get_active_clocks_shifted(ap, t.active) | |
| 234 | atp867x_get_recover_clocks_shifted(t.recover); | 240 | atp867x_get_recover_clocks_shifted(t.recover); |
| 235 | if (dp->pci66mhz) | ||
| 236 | b += 0x10; | ||
| 237 | 241 | ||
| 238 | if (adev->devno & 1) | 242 | if (adev->devno & 1) |
| 239 | iowrite8(b, dp->slave_piospd); | 243 | iowrite8(b, dp->slave_piospd); |
| 240 | else | 244 | else |
| 241 | iowrite8(b, dp->mstr_piospd); | 245 | iowrite8(b, dp->mstr_piospd); |
| 242 | 246 | ||
| 243 | /* | 247 | b = atp867x_get_active_clocks_shifted(ap, t.act8b) | |
| 244 | * use the same value for comand timing as for PIO timimg | 248 | atp867x_get_recover_clocks_shifted(t.rec8b); |
| 245 | */ | 249 | |
| 246 | iowrite8(b, dp->eightb_piospd); | 250 | iowrite8(b, dp->eightb_piospd); |
| 247 | } | 251 | } |
| 248 | 252 | ||
| 253 | static int atp867x_cable_override(struct pci_dev *pdev) | ||
| 254 | { | ||
| 255 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_ARTOP && | ||
| 256 | (pdev->subsystem_device == PCI_DEVICE_ID_ARTOP_ATP867A || | ||
| 257 | pdev->subsystem_device == PCI_DEVICE_ID_ARTOP_ATP867B)) { | ||
| 258 | return 1; | ||
| 259 | } | ||
| 260 | return 0; | ||
| 261 | } | ||
| 262 | |||
| 249 | static int atp867x_cable_detect(struct ata_port *ap) | 263 | static int atp867x_cable_detect(struct ata_port *ap) |
| 250 | { | 264 | { |
| 251 | return ATA_CBL_PATA40_SHORT; | 265 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 266 | |||
| 267 | if (atp867x_cable_override(pdev)) | ||
| 268 | return ATA_CBL_PATA40_SHORT; | ||
| 269 | |||
| 270 | return ATA_CBL_PATA_UNK; | ||
| 252 | } | 271 | } |
| 253 | 272 | ||
| 254 | static struct scsi_host_template atp867x_sht = { | 273 | static struct scsi_host_template atp867x_sht = { |
| @@ -471,7 +490,6 @@ static int atp867x_init_one(struct pci_dev *pdev, | |||
| 471 | static const struct ata_port_info info_867x = { | 490 | static const struct ata_port_info info_867x = { |
| 472 | .flags = ATA_FLAG_SLAVE_POSS, | 491 | .flags = ATA_FLAG_SLAVE_POSS, |
| 473 | .pio_mask = ATA_PIO4, | 492 | .pio_mask = ATA_PIO4, |
| 474 | .mwdma_mask = ATA_MWDMA2, | ||
| 475 | .udma_mask = ATA_UDMA6, | 493 | .udma_mask = ATA_UDMA6, |
| 476 | .port_ops = &atp867x_ops, | 494 | .port_ops = &atp867x_ops, |
| 477 | }; | 495 | }; |
| @@ -515,6 +533,23 @@ err_out: | |||
| 515 | return rc; | 533 | return rc; |
| 516 | } | 534 | } |
| 517 | 535 | ||
| 536 | #ifdef CONFIG_PM | ||
| 537 | static int atp867x_reinit_one(struct pci_dev *pdev) | ||
| 538 | { | ||
| 539 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | ||
| 540 | int rc; | ||
| 541 | |||
| 542 | rc = ata_pci_device_do_resume(pdev); | ||
| 543 | if (rc) | ||
| 544 | return rc; | ||
| 545 | |||
| 546 | atp867x_fixup(host); | ||
| 547 | |||
| 548 | ata_host_resume(host); | ||
| 549 | return 0; | ||
| 550 | } | ||
| 551 | #endif | ||
| 552 | |||
| 518 | static struct pci_device_id atp867x_pci_tbl[] = { | 553 | static struct pci_device_id atp867x_pci_tbl[] = { |
| 519 | { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867A), 0 }, | 554 | { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867A), 0 }, |
| 520 | { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867B), 0 }, | 555 | { PCI_VDEVICE(ARTOP, PCI_DEVICE_ID_ARTOP_ATP867B), 0 }, |
| @@ -526,6 +561,10 @@ static struct pci_driver atp867x_driver = { | |||
| 526 | .id_table = atp867x_pci_tbl, | 561 | .id_table = atp867x_pci_tbl, |
| 527 | .probe = atp867x_init_one, | 562 | .probe = atp867x_init_one, |
| 528 | .remove = ata_pci_remove_one, | 563 | .remove = ata_pci_remove_one, |
| 564 | #ifdef CONFIG_PM | ||
| 565 | .suspend = ata_pci_device_suspend, | ||
| 566 | .resume = atp867x_reinit_one, | ||
| 567 | #endif | ||
| 529 | }; | 568 | }; |
| 530 | 569 | ||
| 531 | static int __init atp867x_init(void) | 570 | static int __init atp867x_init(void) |
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c index 60ab75104da9..1c129211302d 100644 --- a/drivers/char/agp/parisc-agp.c +++ b/drivers/char/agp/parisc-agp.c | |||
| @@ -217,7 +217,7 @@ static const struct agp_bridge_driver parisc_agp_driver = { | |||
| 217 | .configure = parisc_agp_configure, | 217 | .configure = parisc_agp_configure, |
| 218 | .fetch_size = parisc_agp_fetch_size, | 218 | .fetch_size = parisc_agp_fetch_size, |
| 219 | .tlb_flush = parisc_agp_tlbflush, | 219 | .tlb_flush = parisc_agp_tlbflush, |
| 220 | .mask_memory = parisc_agp_page_mask_memory, | 220 | .mask_memory = parisc_agp_mask_memory, |
| 221 | .masks = parisc_agp_masks, | 221 | .masks = parisc_agp_masks, |
| 222 | .agp_enable = parisc_agp_enable, | 222 | .agp_enable = parisc_agp_enable, |
| 223 | .cache_flush = global_cache_flush, | 223 | .cache_flush = global_cache_flush, |
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index 45d58002b06c..47c2d2763456 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c | |||
| @@ -696,8 +696,7 @@ int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf) | |||
| 696 | 696 | ||
| 697 | cmd.header.in = pcrread_header; | 697 | cmd.header.in = pcrread_header; |
| 698 | cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx); | 698 | cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx); |
| 699 | BUG_ON(cmd.header.in.length > READ_PCR_RESULT_SIZE); | 699 | rc = transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE, |
| 700 | rc = transmit_cmd(chip, &cmd, cmd.header.in.length, | ||
| 701 | "attempting to read a pcr value"); | 700 | "attempting to read a pcr value"); |
| 702 | 701 | ||
| 703 | if (rc == 0) | 702 | if (rc == 0) |
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index abf4a2529f80..60697909ebdb 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c | |||
| @@ -227,7 +227,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack) | |||
| 227 | * cn_proc_mcast_ctl | 227 | * cn_proc_mcast_ctl |
| 228 | * @data: message sent from userspace via the connector | 228 | * @data: message sent from userspace via the connector |
| 229 | */ | 229 | */ |
| 230 | static void cn_proc_mcast_ctl(struct cn_msg *msg) | 230 | static void cn_proc_mcast_ctl(struct cn_msg *msg, |
| 231 | struct netlink_skb_parms *nsp) | ||
| 231 | { | 232 | { |
| 232 | enum proc_cn_mcast_op *mc_op = NULL; | 233 | enum proc_cn_mcast_op *mc_op = NULL; |
| 233 | int err = 0; | 234 | int err = 0; |
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index 02127e59fe8e..55c9c59b3f71 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
| @@ -47,6 +47,18 @@ config EDAC_DEBUG_VERBOSE | |||
| 47 | Source file name and line number where debugging message | 47 | Source file name and line number where debugging message |
| 48 | printed will be added to debugging message. | 48 | printed will be added to debugging message. |
| 49 | 49 | ||
| 50 | config EDAC_DECODE_MCE | ||
| 51 | tristate "Decode MCEs in human-readable form (only on AMD for now)" | ||
| 52 | depends on CPU_SUP_AMD && X86_MCE | ||
| 53 | default y | ||
| 54 | ---help--- | ||
| 55 | Enable this option if you want to decode Machine Check Exceptions | ||
| 56 | occuring on your machine in human-readable form. | ||
| 57 | |||
| 58 | You should definitely say Y here in case you want to decode MCEs | ||
| 59 | which occur really early upon boot, before the module infrastructure | ||
| 60 | has been initialized. | ||
| 61 | |||
| 50 | config EDAC_MM_EDAC | 62 | config EDAC_MM_EDAC |
| 51 | tristate "Main Memory EDAC (Error Detection And Correction) reporting" | 63 | tristate "Main Memory EDAC (Error Detection And Correction) reporting" |
| 52 | help | 64 | help |
| @@ -59,7 +71,7 @@ config EDAC_MM_EDAC | |||
| 59 | 71 | ||
| 60 | config EDAC_AMD64 | 72 | config EDAC_AMD64 |
| 61 | tristate "AMD64 (Opteron, Athlon64) K8, F10h, F11h" | 73 | tristate "AMD64 (Opteron, Athlon64) K8, F10h, F11h" |
| 62 | depends on EDAC_MM_EDAC && K8_NB && X86_64 && PCI && CPU_SUP_AMD | 74 | depends on EDAC_MM_EDAC && K8_NB && X86_64 && PCI && EDAC_DECODE_MCE |
| 63 | help | 75 | help |
| 64 | Support for error detection and correction on the AMD 64 | 76 | Support for error detection and correction on the AMD 64 |
| 65 | Families of Memory Controllers (K8, F10h and F11h) | 77 | Families of Memory Controllers (K8, F10h and F11h) |
diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile index 7a473bbe8abd..bc5dc232a0fb 100644 --- a/drivers/edac/Makefile +++ b/drivers/edac/Makefile | |||
| @@ -6,7 +6,6 @@ | |||
| 6 | # GNU General Public License. | 6 | # GNU General Public License. |
| 7 | # | 7 | # |
| 8 | 8 | ||
| 9 | |||
| 10 | obj-$(CONFIG_EDAC) := edac_stub.o | 9 | obj-$(CONFIG_EDAC) := edac_stub.o |
| 11 | obj-$(CONFIG_EDAC_MM_EDAC) += edac_core.o | 10 | obj-$(CONFIG_EDAC_MM_EDAC) += edac_core.o |
| 12 | 11 | ||
| @@ -17,9 +16,7 @@ ifdef CONFIG_PCI | |||
| 17 | edac_core-objs += edac_pci.o edac_pci_sysfs.o | 16 | edac_core-objs += edac_pci.o edac_pci_sysfs.o |
| 18 | endif | 17 | endif |
| 19 | 18 | ||
| 20 | ifdef CONFIG_CPU_SUP_AMD | 19 | obj-$(CONFIG_EDAC_DECODE_MCE) += edac_mce_amd.o |
| 21 | edac_core-objs += edac_mce_amd.o | ||
| 22 | endif | ||
| 23 | 20 | ||
| 24 | obj-$(CONFIG_EDAC_AMD76X) += amd76x_edac.o | 21 | obj-$(CONFIG_EDAC_AMD76X) += amd76x_edac.o |
| 25 | obj-$(CONFIG_EDAC_CPC925) += cpc925_edac.o | 22 | obj-$(CONFIG_EDAC_CPC925) += cpc925_edac.o |
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 4e551e63b6dc..4f4ac82382f7 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
| @@ -15,8 +15,8 @@ module_param(ecc_enable_override, int, 0644); | |||
| 15 | 15 | ||
| 16 | /* Lookup table for all possible MC control instances */ | 16 | /* Lookup table for all possible MC control instances */ |
| 17 | struct amd64_pvt; | 17 | struct amd64_pvt; |
| 18 | static struct mem_ctl_info *mci_lookup[MAX_NUMNODES]; | 18 | static struct mem_ctl_info *mci_lookup[EDAC_MAX_NUMNODES]; |
| 19 | static struct amd64_pvt *pvt_lookup[MAX_NUMNODES]; | 19 | static struct amd64_pvt *pvt_lookup[EDAC_MAX_NUMNODES]; |
| 20 | 20 | ||
| 21 | /* | 21 | /* |
| 22 | * See F2x80 for K8 and F2x[1,0]80 for Fam10 and later. The table below is only | 22 | * See F2x80 for K8 and F2x[1,0]80 for Fam10 and later. The table below is only |
| @@ -189,7 +189,10 @@ static int amd64_get_scrub_rate(struct mem_ctl_info *mci, u32 *bw) | |||
| 189 | /* Map from a CSROW entry to the mask entry that operates on it */ | 189 | /* Map from a CSROW entry to the mask entry that operates on it */ |
| 190 | static inline u32 amd64_map_to_dcs_mask(struct amd64_pvt *pvt, int csrow) | 190 | static inline u32 amd64_map_to_dcs_mask(struct amd64_pvt *pvt, int csrow) |
| 191 | { | 191 | { |
| 192 | return csrow >> (pvt->num_dcsm >> 3); | 192 | if (boot_cpu_data.x86 == 0xf && pvt->ext_model < OPTERON_CPU_REV_F) |
| 193 | return csrow; | ||
| 194 | else | ||
| 195 | return csrow >> 1; | ||
| 193 | } | 196 | } |
| 194 | 197 | ||
| 195 | /* return the 'base' address the i'th CS entry of the 'dct' DRAM controller */ | 198 | /* return the 'base' address the i'th CS entry of the 'dct' DRAM controller */ |
| @@ -279,29 +282,26 @@ static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci, | |||
| 279 | intlv_en = pvt->dram_IntlvEn[0]; | 282 | intlv_en = pvt->dram_IntlvEn[0]; |
| 280 | 283 | ||
| 281 | if (intlv_en == 0) { | 284 | if (intlv_en == 0) { |
| 282 | for (node_id = 0; ; ) { | 285 | for (node_id = 0; node_id < DRAM_REG_COUNT; node_id++) { |
| 283 | if (amd64_base_limit_match(pvt, sys_addr, node_id)) | 286 | if (amd64_base_limit_match(pvt, sys_addr, node_id)) |
| 284 | break; | 287 | goto found; |
| 285 | |||
| 286 | if (++node_id >= DRAM_REG_COUNT) | ||
| 287 | goto err_no_match; | ||
| 288 | } | 288 | } |
| 289 | goto found; | 289 | goto err_no_match; |
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | if (unlikely((intlv_en != (0x01 << 8)) && | 292 | if (unlikely((intlv_en != 0x01) && |
| 293 | (intlv_en != (0x03 << 8)) && | 293 | (intlv_en != 0x03) && |
| 294 | (intlv_en != (0x07 << 8)))) { | 294 | (intlv_en != 0x07))) { |
| 295 | amd64_printk(KERN_WARNING, "junk value of 0x%x extracted from " | 295 | amd64_printk(KERN_WARNING, "junk value of 0x%x extracted from " |
| 296 | "IntlvEn field of DRAM Base Register for node 0: " | 296 | "IntlvEn field of DRAM Base Register for node 0: " |
| 297 | "This probably indicates a BIOS bug.\n", intlv_en); | 297 | "this probably indicates a BIOS bug.\n", intlv_en); |
| 298 | return NULL; | 298 | return NULL; |
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | bits = (((u32) sys_addr) >> 12) & intlv_en; | 301 | bits = (((u32) sys_addr) >> 12) & intlv_en; |
| 302 | 302 | ||
| 303 | for (node_id = 0; ; ) { | 303 | for (node_id = 0; ; ) { |
| 304 | if ((pvt->dram_limit[node_id] & intlv_en) == bits) | 304 | if ((pvt->dram_IntlvSel[node_id] & intlv_en) == bits) |
| 305 | break; /* intlv_sel field matches */ | 305 | break; /* intlv_sel field matches */ |
| 306 | 306 | ||
| 307 | if (++node_id >= DRAM_REG_COUNT) | 307 | if (++node_id >= DRAM_REG_COUNT) |
| @@ -311,10 +311,10 @@ static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci, | |||
| 311 | /* sanity test for sys_addr */ | 311 | /* sanity test for sys_addr */ |
| 312 | if (unlikely(!amd64_base_limit_match(pvt, sys_addr, node_id))) { | 312 | if (unlikely(!amd64_base_limit_match(pvt, sys_addr, node_id))) { |
| 313 | amd64_printk(KERN_WARNING, | 313 | amd64_printk(KERN_WARNING, |
| 314 | "%s(): sys_addr 0x%lx falls outside base/limit " | 314 | "%s(): sys_addr 0x%llx falls outside base/limit " |
| 315 | "address range for node %d with node interleaving " | 315 | "address range for node %d with node interleaving " |
| 316 | "enabled.\n", __func__, (unsigned long)sys_addr, | 316 | "enabled.\n", |
| 317 | node_id); | 317 | __func__, sys_addr, node_id); |
| 318 | return NULL; | 318 | return NULL; |
| 319 | } | 319 | } |
| 320 | 320 | ||
| @@ -377,7 +377,7 @@ static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr) | |||
| 377 | * base/mask register pair, test the condition shown near the start of | 377 | * base/mask register pair, test the condition shown near the start of |
| 378 | * section 3.5.4 (p. 84, BKDG #26094, K8, revA-E). | 378 | * section 3.5.4 (p. 84, BKDG #26094, K8, revA-E). |
| 379 | */ | 379 | */ |
| 380 | for (csrow = 0; csrow < CHIPSELECT_COUNT; csrow++) { | 380 | for (csrow = 0; csrow < pvt->cs_count; csrow++) { |
| 381 | 381 | ||
| 382 | /* This DRAM chip select is disabled on this node */ | 382 | /* This DRAM chip select is disabled on this node */ |
| 383 | if ((pvt->dcsb0[csrow] & K8_DCSB_CS_ENABLE) == 0) | 383 | if ((pvt->dcsb0[csrow] & K8_DCSB_CS_ENABLE) == 0) |
| @@ -734,7 +734,7 @@ static void find_csrow_limits(struct mem_ctl_info *mci, int csrow, | |||
| 734 | u64 base, mask; | 734 | u64 base, mask; |
| 735 | 735 | ||
| 736 | pvt = mci->pvt_info; | 736 | pvt = mci->pvt_info; |
| 737 | BUG_ON((csrow < 0) || (csrow >= CHIPSELECT_COUNT)); | 737 | BUG_ON((csrow < 0) || (csrow >= pvt->cs_count)); |
| 738 | 738 | ||
| 739 | base = base_from_dct_base(pvt, csrow); | 739 | base = base_from_dct_base(pvt, csrow); |
| 740 | mask = mask_from_dct_mask(pvt, csrow); | 740 | mask = mask_from_dct_mask(pvt, csrow); |
| @@ -962,35 +962,27 @@ err_reg: | |||
| 962 | */ | 962 | */ |
| 963 | static void amd64_set_dct_base_and_mask(struct amd64_pvt *pvt) | 963 | static void amd64_set_dct_base_and_mask(struct amd64_pvt *pvt) |
| 964 | { | 964 | { |
| 965 | if (pvt->ext_model >= OPTERON_CPU_REV_F) { | 965 | |
| 966 | if (boot_cpu_data.x86 == 0xf && pvt->ext_model < OPTERON_CPU_REV_F) { | ||
| 967 | pvt->dcsb_base = REV_E_DCSB_BASE_BITS; | ||
| 968 | pvt->dcsm_mask = REV_E_DCSM_MASK_BITS; | ||
| 969 | pvt->dcs_mask_notused = REV_E_DCS_NOTUSED_BITS; | ||
| 970 | pvt->dcs_shift = REV_E_DCS_SHIFT; | ||
| 971 | pvt->cs_count = 8; | ||
| 972 | pvt->num_dcsm = 8; | ||
| 973 | } else { | ||
| 966 | pvt->dcsb_base = REV_F_F1Xh_DCSB_BASE_BITS; | 974 | pvt->dcsb_base = REV_F_F1Xh_DCSB_BASE_BITS; |
| 967 | pvt->dcsm_mask = REV_F_F1Xh_DCSM_MASK_BITS; | 975 | pvt->dcsm_mask = REV_F_F1Xh_DCSM_MASK_BITS; |
| 968 | pvt->dcs_mask_notused = REV_F_F1Xh_DCS_NOTUSED_BITS; | 976 | pvt->dcs_mask_notused = REV_F_F1Xh_DCS_NOTUSED_BITS; |
| 969 | pvt->dcs_shift = REV_F_F1Xh_DCS_SHIFT; | 977 | pvt->dcs_shift = REV_F_F1Xh_DCS_SHIFT; |
| 970 | 978 | ||
| 971 | switch (boot_cpu_data.x86) { | 979 | if (boot_cpu_data.x86 == 0x11) { |
| 972 | case 0xf: | 980 | pvt->cs_count = 4; |
| 973 | pvt->num_dcsm = REV_F_DCSM_COUNT; | 981 | pvt->num_dcsm = 2; |
| 974 | break; | 982 | } else { |
| 975 | 983 | pvt->cs_count = 8; | |
| 976 | case 0x10: | 984 | pvt->num_dcsm = 4; |
| 977 | pvt->num_dcsm = F10_DCSM_COUNT; | ||
| 978 | break; | ||
| 979 | |||
| 980 | case 0x11: | ||
| 981 | pvt->num_dcsm = F11_DCSM_COUNT; | ||
| 982 | break; | ||
| 983 | |||
| 984 | default: | ||
| 985 | amd64_printk(KERN_ERR, "Unsupported family!\n"); | ||
| 986 | break; | ||
| 987 | } | 985 | } |
| 988 | } else { | ||
| 989 | pvt->dcsb_base = REV_E_DCSB_BASE_BITS; | ||
| 990 | pvt->dcsm_mask = REV_E_DCSM_MASK_BITS; | ||
| 991 | pvt->dcs_mask_notused = REV_E_DCS_NOTUSED_BITS; | ||
| 992 | pvt->dcs_shift = REV_E_DCS_SHIFT; | ||
| 993 | pvt->num_dcsm = REV_E_DCSM_COUNT; | ||
| 994 | } | 986 | } |
| 995 | } | 987 | } |
| 996 | 988 | ||
| @@ -1003,7 +995,7 @@ static void amd64_read_dct_base_mask(struct amd64_pvt *pvt) | |||
| 1003 | 995 | ||
| 1004 | amd64_set_dct_base_and_mask(pvt); | 996 | amd64_set_dct_base_and_mask(pvt); |
| 1005 | 997 | ||
| 1006 | for (cs = 0; cs < CHIPSELECT_COUNT; cs++) { | 998 | for (cs = 0; cs < pvt->cs_count; cs++) { |
| 1007 | reg = K8_DCSB0 + (cs * 4); | 999 | reg = K8_DCSB0 + (cs * 4); |
| 1008 | err = pci_read_config_dword(pvt->dram_f2_ctl, reg, | 1000 | err = pci_read_config_dword(pvt->dram_f2_ctl, reg, |
| 1009 | &pvt->dcsb0[cs]); | 1001 | &pvt->dcsb0[cs]); |
| @@ -1130,7 +1122,7 @@ static void k8_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
| 1130 | debugf0("Reading K8_DRAM_BASE_LOW failed\n"); | 1122 | debugf0("Reading K8_DRAM_BASE_LOW failed\n"); |
| 1131 | 1123 | ||
| 1132 | /* Extract parts into separate data entries */ | 1124 | /* Extract parts into separate data entries */ |
| 1133 | pvt->dram_base[dram] = ((u64) low & 0xFFFF0000) << 8; | 1125 | pvt->dram_base[dram] = ((u64) low & 0xFFFF0000) << 24; |
| 1134 | pvt->dram_IntlvEn[dram] = (low >> 8) & 0x7; | 1126 | pvt->dram_IntlvEn[dram] = (low >> 8) & 0x7; |
| 1135 | pvt->dram_rw_en[dram] = (low & 0x3); | 1127 | pvt->dram_rw_en[dram] = (low & 0x3); |
| 1136 | 1128 | ||
| @@ -1143,7 +1135,7 @@ static void k8_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
| 1143 | * Extract parts into separate data entries. Limit is the HIGHEST memory | 1135 | * Extract parts into separate data entries. Limit is the HIGHEST memory |
| 1144 | * location of the region, so lower 24 bits need to be all ones | 1136 | * location of the region, so lower 24 bits need to be all ones |
| 1145 | */ | 1137 | */ |
| 1146 | pvt->dram_limit[dram] = (((u64) low & 0xFFFF0000) << 8) | 0x00FFFFFF; | 1138 | pvt->dram_limit[dram] = (((u64) low & 0xFFFF0000) << 24) | 0x00FFFFFF; |
| 1147 | pvt->dram_IntlvSel[dram] = (low >> 8) & 0x7; | 1139 | pvt->dram_IntlvSel[dram] = (low >> 8) & 0x7; |
| 1148 | pvt->dram_DstNode[dram] = (low & 0x7); | 1140 | pvt->dram_DstNode[dram] = (low & 0x7); |
| 1149 | } | 1141 | } |
| @@ -1193,7 +1185,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, | |||
| 1193 | * different from the node that detected the error. | 1185 | * different from the node that detected the error. |
| 1194 | */ | 1186 | */ |
| 1195 | src_mci = find_mc_by_sys_addr(mci, SystemAddress); | 1187 | src_mci = find_mc_by_sys_addr(mci, SystemAddress); |
| 1196 | if (src_mci) { | 1188 | if (!src_mci) { |
| 1197 | amd64_mc_printk(mci, KERN_ERR, | 1189 | amd64_mc_printk(mci, KERN_ERR, |
| 1198 | "failed to map error address 0x%lx to a node\n", | 1190 | "failed to map error address 0x%lx to a node\n", |
| 1199 | (unsigned long)SystemAddress); | 1191 | (unsigned long)SystemAddress); |
| @@ -1376,8 +1368,8 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
| 1376 | 1368 | ||
| 1377 | pvt->dram_IntlvEn[dram] = (low_base >> 8) & 0x7; | 1369 | pvt->dram_IntlvEn[dram] = (low_base >> 8) & 0x7; |
| 1378 | 1370 | ||
| 1379 | pvt->dram_base[dram] = (((((u64) high_base & 0x000000FF) << 32) | | 1371 | pvt->dram_base[dram] = (((u64)high_base & 0x000000FF) << 40) | |
| 1380 | ((u64) low_base & 0xFFFF0000))) << 8; | 1372 | (((u64)low_base & 0xFFFF0000) << 24); |
| 1381 | 1373 | ||
| 1382 | low_offset = K8_DRAM_LIMIT_LOW + (dram << 3); | 1374 | low_offset = K8_DRAM_LIMIT_LOW + (dram << 3); |
| 1383 | high_offset = F10_DRAM_LIMIT_HIGH + (dram << 3); | 1375 | high_offset = F10_DRAM_LIMIT_HIGH + (dram << 3); |
| @@ -1398,9 +1390,9 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
| 1398 | * Extract address values and form a LIMIT address. Limit is the HIGHEST | 1390 | * Extract address values and form a LIMIT address. Limit is the HIGHEST |
| 1399 | * memory location of the region, so low 24 bits need to be all ones. | 1391 | * memory location of the region, so low 24 bits need to be all ones. |
| 1400 | */ | 1392 | */ |
| 1401 | low_limit |= 0x0000FFFF; | 1393 | pvt->dram_limit[dram] = (((u64)high_limit & 0x000000FF) << 40) | |
| 1402 | pvt->dram_limit[dram] = | 1394 | (((u64) low_limit & 0xFFFF0000) << 24) | |
| 1403 | ((((u64) high_limit << 32) + (u64) low_limit) << 8) | (0xFF); | 1395 | 0x00FFFFFF; |
| 1404 | } | 1396 | } |
| 1405 | 1397 | ||
| 1406 | static void f10_read_dram_ctl_register(struct amd64_pvt *pvt) | 1398 | static void f10_read_dram_ctl_register(struct amd64_pvt *pvt) |
| @@ -1566,7 +1558,7 @@ static int f10_lookup_addr_in_dct(u32 in_addr, u32 nid, u32 cs) | |||
| 1566 | 1558 | ||
| 1567 | debugf1("InputAddr=0x%x channelselect=%d\n", in_addr, cs); | 1559 | debugf1("InputAddr=0x%x channelselect=%d\n", in_addr, cs); |
| 1568 | 1560 | ||
| 1569 | for (csrow = 0; csrow < CHIPSELECT_COUNT; csrow++) { | 1561 | for (csrow = 0; csrow < pvt->cs_count; csrow++) { |
| 1570 | 1562 | ||
| 1571 | cs_base = amd64_get_dct_base(pvt, cs, csrow); | 1563 | cs_base = amd64_get_dct_base(pvt, cs, csrow); |
| 1572 | if (!(cs_base & K8_DCSB_CS_ENABLE)) | 1564 | if (!(cs_base & K8_DCSB_CS_ENABLE)) |
| @@ -2497,7 +2489,7 @@ err_reg: | |||
| 2497 | * NOTE: CPU Revision Dependent code | 2489 | * NOTE: CPU Revision Dependent code |
| 2498 | * | 2490 | * |
| 2499 | * Input: | 2491 | * Input: |
| 2500 | * @csrow_nr ChipSelect Row Number (0..CHIPSELECT_COUNT-1) | 2492 | * @csrow_nr ChipSelect Row Number (0..pvt->cs_count-1) |
| 2501 | * k8 private pointer to --> | 2493 | * k8 private pointer to --> |
| 2502 | * DRAM Bank Address mapping register | 2494 | * DRAM Bank Address mapping register |
| 2503 | * node_id | 2495 | * node_id |
| @@ -2577,7 +2569,7 @@ static int amd64_init_csrows(struct mem_ctl_info *mci) | |||
| 2577 | (pvt->nbcfg & K8_NBCFG_ECC_ENABLE) ? "Enabled" : "Disabled" | 2569 | (pvt->nbcfg & K8_NBCFG_ECC_ENABLE) ? "Enabled" : "Disabled" |
| 2578 | ); | 2570 | ); |
| 2579 | 2571 | ||
| 2580 | for (i = 0; i < CHIPSELECT_COUNT; i++) { | 2572 | for (i = 0; i < pvt->cs_count; i++) { |
| 2581 | csrow = &mci->csrows[i]; | 2573 | csrow = &mci->csrows[i]; |
| 2582 | 2574 | ||
| 2583 | if ((pvt->dcsb0[i] & K8_DCSB_CS_ENABLE) == 0) { | 2575 | if ((pvt->dcsb0[i] & K8_DCSB_CS_ENABLE) == 0) { |
| @@ -2988,7 +2980,7 @@ static int amd64_init_2nd_stage(struct amd64_pvt *pvt) | |||
| 2988 | goto err_exit; | 2980 | goto err_exit; |
| 2989 | 2981 | ||
| 2990 | ret = -ENOMEM; | 2982 | ret = -ENOMEM; |
| 2991 | mci = edac_mc_alloc(0, CHIPSELECT_COUNT, pvt->channel_count, node_id); | 2983 | mci = edac_mc_alloc(0, pvt->cs_count, pvt->channel_count, node_id); |
| 2992 | if (!mci) | 2984 | if (!mci) |
| 2993 | goto err_exit; | 2985 | goto err_exit; |
| 2994 | 2986 | ||
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 8ea07e2715dc..c6f359a85207 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h | |||
| @@ -132,6 +132,8 @@ | |||
| 132 | #define EDAC_AMD64_VERSION " Ver: 3.2.0 " __DATE__ | 132 | #define EDAC_AMD64_VERSION " Ver: 3.2.0 " __DATE__ |
| 133 | #define EDAC_MOD_STR "amd64_edac" | 133 | #define EDAC_MOD_STR "amd64_edac" |
| 134 | 134 | ||
| 135 | #define EDAC_MAX_NUMNODES 8 | ||
| 136 | |||
| 135 | /* Extended Model from CPUID, for CPU Revision numbers */ | 137 | /* Extended Model from CPUID, for CPU Revision numbers */ |
| 136 | #define OPTERON_CPU_LE_REV_C 0 | 138 | #define OPTERON_CPU_LE_REV_C 0 |
| 137 | #define OPTERON_CPU_REV_D 1 | 139 | #define OPTERON_CPU_REV_D 1 |
| @@ -142,7 +144,7 @@ | |||
| 142 | #define OPTERON_CPU_REV_FA 5 | 144 | #define OPTERON_CPU_REV_FA 5 |
| 143 | 145 | ||
| 144 | /* Hardware limit on ChipSelect rows per MC and processors per system */ | 146 | /* Hardware limit on ChipSelect rows per MC and processors per system */ |
| 145 | #define CHIPSELECT_COUNT 8 | 147 | #define MAX_CS_COUNT 8 |
| 146 | #define DRAM_REG_COUNT 8 | 148 | #define DRAM_REG_COUNT 8 |
| 147 | 149 | ||
| 148 | 150 | ||
| @@ -193,7 +195,6 @@ | |||
| 193 | */ | 195 | */ |
| 194 | #define REV_E_DCSB_BASE_BITS (0xFFE0FE00ULL) | 196 | #define REV_E_DCSB_BASE_BITS (0xFFE0FE00ULL) |
| 195 | #define REV_E_DCS_SHIFT 4 | 197 | #define REV_E_DCS_SHIFT 4 |
| 196 | #define REV_E_DCSM_COUNT 8 | ||
| 197 | 198 | ||
| 198 | #define REV_F_F1Xh_DCSB_BASE_BITS (0x1FF83FE0ULL) | 199 | #define REV_F_F1Xh_DCSB_BASE_BITS (0x1FF83FE0ULL) |
| 199 | #define REV_F_F1Xh_DCS_SHIFT 8 | 200 | #define REV_F_F1Xh_DCS_SHIFT 8 |
| @@ -204,9 +205,6 @@ | |||
| 204 | */ | 205 | */ |
| 205 | #define REV_F_DCSB_BASE_BITS (0x1FF83FE0ULL) | 206 | #define REV_F_DCSB_BASE_BITS (0x1FF83FE0ULL) |
| 206 | #define REV_F_DCS_SHIFT 8 | 207 | #define REV_F_DCS_SHIFT 8 |
| 207 | #define REV_F_DCSM_COUNT 4 | ||
| 208 | #define F10_DCSM_COUNT 4 | ||
| 209 | #define F11_DCSM_COUNT 2 | ||
| 210 | 208 | ||
| 211 | /* DRAM CS Mask Registers */ | 209 | /* DRAM CS Mask Registers */ |
| 212 | #define K8_DCSM0 0x60 | 210 | #define K8_DCSM0 0x60 |
| @@ -374,13 +372,11 @@ enum { | |||
| 374 | 372 | ||
| 375 | #define SET_NB_DRAM_INJECTION_WRITE(word, bits) \ | 373 | #define SET_NB_DRAM_INJECTION_WRITE(word, bits) \ |
| 376 | (BIT(((word) & 0xF) + 20) | \ | 374 | (BIT(((word) & 0xF) + 20) | \ |
| 377 | BIT(17) | \ | 375 | BIT(17) | bits) |
| 378 | ((bits) & 0xF)) | ||
| 379 | 376 | ||
| 380 | #define SET_NB_DRAM_INJECTION_READ(word, bits) \ | 377 | #define SET_NB_DRAM_INJECTION_READ(word, bits) \ |
| 381 | (BIT(((word) & 0xF) + 20) | \ | 378 | (BIT(((word) & 0xF) + 20) | \ |
| 382 | BIT(16) | \ | 379 | BIT(16) | bits) |
| 383 | ((bits) & 0xF)) | ||
| 384 | 380 | ||
| 385 | #define K8_NBCAP 0xE8 | 381 | #define K8_NBCAP 0xE8 |
| 386 | #define K8_NBCAP_CORES (BIT(12)|BIT(13)) | 382 | #define K8_NBCAP_CORES (BIT(12)|BIT(13)) |
| @@ -445,12 +441,12 @@ struct amd64_pvt { | |||
| 445 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ | 441 | u32 dbam1; /* DRAM Base Address Mapping reg for DCT1 */ |
| 446 | 442 | ||
| 447 | /* DRAM CS Base Address Registers F2x[1,0][5C:40] */ | 443 | /* DRAM CS Base Address Registers F2x[1,0][5C:40] */ |
| 448 | u32 dcsb0[CHIPSELECT_COUNT]; | 444 | u32 dcsb0[MAX_CS_COUNT]; |
| 449 | u32 dcsb1[CHIPSELECT_COUNT]; | 445 | u32 dcsb1[MAX_CS_COUNT]; |
| 450 | 446 | ||
| 451 | /* DRAM CS Mask Registers F2x[1,0][6C:60] */ | 447 | /* DRAM CS Mask Registers F2x[1,0][6C:60] */ |
| 452 | u32 dcsm0[CHIPSELECT_COUNT]; | 448 | u32 dcsm0[MAX_CS_COUNT]; |
| 453 | u32 dcsm1[CHIPSELECT_COUNT]; | 449 | u32 dcsm1[MAX_CS_COUNT]; |
| 454 | 450 | ||
| 455 | /* | 451 | /* |
| 456 | * Decoded parts of DRAM BASE and LIMIT Registers | 452 | * Decoded parts of DRAM BASE and LIMIT Registers |
| @@ -470,6 +466,7 @@ struct amd64_pvt { | |||
| 470 | */ | 466 | */ |
| 471 | u32 dcsb_base; /* DCSB base bits */ | 467 | u32 dcsb_base; /* DCSB base bits */ |
| 472 | u32 dcsm_mask; /* DCSM mask bits */ | 468 | u32 dcsm_mask; /* DCSM mask bits */ |
| 469 | u32 cs_count; /* num chip selects (== num DCSB registers) */ | ||
| 473 | u32 num_dcsm; /* Number of DCSM registers */ | 470 | u32 num_dcsm; /* Number of DCSM registers */ |
| 474 | u32 dcs_mask_notused; /* DCSM notused mask bits */ | 471 | u32 dcs_mask_notused; /* DCSM notused mask bits */ |
| 475 | u32 dcs_shift; /* DCSB and DCSM shift value */ | 472 | u32 dcs_shift; /* DCSB and DCSM shift value */ |
diff --git a/drivers/edac/amd64_edac_inj.c b/drivers/edac/amd64_edac_inj.c index d3675b76b3a7..29f1f7a612d9 100644 --- a/drivers/edac/amd64_edac_inj.c +++ b/drivers/edac/amd64_edac_inj.c | |||
| @@ -1,5 +1,11 @@ | |||
| 1 | #include "amd64_edac.h" | 1 | #include "amd64_edac.h" |
| 2 | 2 | ||
| 3 | static ssize_t amd64_inject_section_show(struct mem_ctl_info *mci, char *buf) | ||
| 4 | { | ||
| 5 | struct amd64_pvt *pvt = mci->pvt_info; | ||
| 6 | return sprintf(buf, "0x%x\n", pvt->injection.section); | ||
| 7 | } | ||
| 8 | |||
| 3 | /* | 9 | /* |
| 4 | * store error injection section value which refers to one of 4 16-byte sections | 10 | * store error injection section value which refers to one of 4 16-byte sections |
| 5 | * within a 64-byte cacheline | 11 | * within a 64-byte cacheline |
| @@ -15,12 +21,26 @@ static ssize_t amd64_inject_section_store(struct mem_ctl_info *mci, | |||
| 15 | 21 | ||
| 16 | ret = strict_strtoul(data, 10, &value); | 22 | ret = strict_strtoul(data, 10, &value); |
| 17 | if (ret != -EINVAL) { | 23 | if (ret != -EINVAL) { |
| 24 | |||
| 25 | if (value > 3) { | ||
| 26 | amd64_printk(KERN_WARNING, | ||
| 27 | "%s: invalid section 0x%lx\n", | ||
| 28 | __func__, value); | ||
| 29 | return -EINVAL; | ||
| 30 | } | ||
| 31 | |||
| 18 | pvt->injection.section = (u32) value; | 32 | pvt->injection.section = (u32) value; |
| 19 | return count; | 33 | return count; |
| 20 | } | 34 | } |
| 21 | return ret; | 35 | return ret; |
| 22 | } | 36 | } |
| 23 | 37 | ||
| 38 | static ssize_t amd64_inject_word_show(struct mem_ctl_info *mci, char *buf) | ||
| 39 | { | ||
| 40 | struct amd64_pvt *pvt = mci->pvt_info; | ||
| 41 | return sprintf(buf, "0x%x\n", pvt->injection.word); | ||
| 42 | } | ||
| 43 | |||
| 24 | /* | 44 | /* |
| 25 | * store error injection word value which refers to one of 9 16-bit word of the | 45 | * store error injection word value which refers to one of 9 16-bit word of the |
| 26 | * 16-byte (128-bit + ECC bits) section | 46 | * 16-byte (128-bit + ECC bits) section |
| @@ -37,14 +57,25 @@ static ssize_t amd64_inject_word_store(struct mem_ctl_info *mci, | |||
| 37 | ret = strict_strtoul(data, 10, &value); | 57 | ret = strict_strtoul(data, 10, &value); |
| 38 | if (ret != -EINVAL) { | 58 | if (ret != -EINVAL) { |
| 39 | 59 | ||
| 40 | value = (value <= 8) ? value : 0; | 60 | if (value > 8) { |
| 41 | pvt->injection.word = (u32) value; | 61 | amd64_printk(KERN_WARNING, |
| 62 | "%s: invalid word 0x%lx\n", | ||
| 63 | __func__, value); | ||
| 64 | return -EINVAL; | ||
| 65 | } | ||
| 42 | 66 | ||
| 67 | pvt->injection.word = (u32) value; | ||
| 43 | return count; | 68 | return count; |
| 44 | } | 69 | } |
| 45 | return ret; | 70 | return ret; |
| 46 | } | 71 | } |
| 47 | 72 | ||
| 73 | static ssize_t amd64_inject_ecc_vector_show(struct mem_ctl_info *mci, char *buf) | ||
| 74 | { | ||
| 75 | struct amd64_pvt *pvt = mci->pvt_info; | ||
| 76 | return sprintf(buf, "0x%x\n", pvt->injection.bit_map); | ||
| 77 | } | ||
| 78 | |||
| 48 | /* | 79 | /* |
| 49 | * store 16 bit error injection vector which enables injecting errors to the | 80 | * store 16 bit error injection vector which enables injecting errors to the |
| 50 | * corresponding bit within the error injection word above. When used during a | 81 | * corresponding bit within the error injection word above. When used during a |
| @@ -60,8 +91,14 @@ static ssize_t amd64_inject_ecc_vector_store(struct mem_ctl_info *mci, | |||
| 60 | ret = strict_strtoul(data, 16, &value); | 91 | ret = strict_strtoul(data, 16, &value); |
| 61 | if (ret != -EINVAL) { | 92 | if (ret != -EINVAL) { |
| 62 | 93 | ||
| 63 | pvt->injection.bit_map = (u32) value & 0xFFFF; | 94 | if (value & 0xFFFF0000) { |
| 95 | amd64_printk(KERN_WARNING, | ||
| 96 | "%s: invalid EccVector: 0x%lx\n", | ||
| 97 | __func__, value); | ||
| 98 | return -EINVAL; | ||
| 99 | } | ||
| 64 | 100 | ||
| 101 | pvt->injection.bit_map = (u32) value; | ||
| 65 | return count; | 102 | return count; |
| 66 | } | 103 | } |
| 67 | return ret; | 104 | return ret; |
| @@ -147,7 +184,7 @@ struct mcidev_sysfs_attribute amd64_inj_attrs[] = { | |||
| 147 | .name = "inject_section", | 184 | .name = "inject_section", |
| 148 | .mode = (S_IRUGO | S_IWUSR) | 185 | .mode = (S_IRUGO | S_IWUSR) |
| 149 | }, | 186 | }, |
| 150 | .show = NULL, | 187 | .show = amd64_inject_section_show, |
| 151 | .store = amd64_inject_section_store, | 188 | .store = amd64_inject_section_store, |
| 152 | }, | 189 | }, |
| 153 | { | 190 | { |
| @@ -155,7 +192,7 @@ struct mcidev_sysfs_attribute amd64_inj_attrs[] = { | |||
| 155 | .name = "inject_word", | 192 | .name = "inject_word", |
| 156 | .mode = (S_IRUGO | S_IWUSR) | 193 | .mode = (S_IRUGO | S_IWUSR) |
| 157 | }, | 194 | }, |
| 158 | .show = NULL, | 195 | .show = amd64_inject_word_show, |
| 159 | .store = amd64_inject_word_store, | 196 | .store = amd64_inject_word_store, |
| 160 | }, | 197 | }, |
| 161 | { | 198 | { |
| @@ -163,7 +200,7 @@ struct mcidev_sysfs_attribute amd64_inj_attrs[] = { | |||
| 163 | .name = "inject_ecc_vector", | 200 | .name = "inject_ecc_vector", |
| 164 | .mode = (S_IRUGO | S_IWUSR) | 201 | .mode = (S_IRUGO | S_IWUSR) |
| 165 | }, | 202 | }, |
| 166 | .show = NULL, | 203 | .show = amd64_inject_ecc_vector_show, |
| 167 | .store = amd64_inject_ecc_vector_store, | 204 | .store = amd64_inject_ecc_vector_store, |
| 168 | }, | 205 | }, |
| 169 | { | 206 | { |
diff --git a/drivers/edac/edac_mce_amd.c b/drivers/edac/edac_mce_amd.c index 0c21c370c9dd..713ed7d37247 100644 --- a/drivers/edac/edac_mce_amd.c +++ b/drivers/edac/edac_mce_amd.c | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | static bool report_gart_errors; | 4 | static bool report_gart_errors; |
| 5 | static void (*nb_bus_decoder)(int node_id, struct err_regs *regs); | 5 | static void (*nb_bus_decoder)(int node_id, struct err_regs *regs); |
| 6 | static void (*orig_mce_callback)(struct mce *m); | ||
| 6 | 7 | ||
| 7 | void amd_report_gart_errors(bool v) | 8 | void amd_report_gart_errors(bool v) |
| 8 | { | 9 | { |
| @@ -362,7 +363,7 @@ static inline void amd_decode_err_code(unsigned int ec) | |||
| 362 | pr_warning("Huh? Unknown MCE error 0x%x\n", ec); | 363 | pr_warning("Huh? Unknown MCE error 0x%x\n", ec); |
| 363 | } | 364 | } |
| 364 | 365 | ||
| 365 | void decode_mce(struct mce *m) | 366 | static void amd_decode_mce(struct mce *m) |
| 366 | { | 367 | { |
| 367 | struct err_regs regs; | 368 | struct err_regs regs; |
| 368 | int node, ecc; | 369 | int node, ecc; |
| @@ -420,3 +421,32 @@ void decode_mce(struct mce *m) | |||
| 420 | 421 | ||
| 421 | amd_decode_err_code(m->status & 0xffff); | 422 | amd_decode_err_code(m->status & 0xffff); |
| 422 | } | 423 | } |
| 424 | |||
| 425 | static int __init mce_amd_init(void) | ||
| 426 | { | ||
| 427 | /* | ||
| 428 | * We can decode MCEs for Opteron and later CPUs: | ||
| 429 | */ | ||
| 430 | if ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) && | ||
| 431 | (boot_cpu_data.x86 >= 0xf)) { | ||
| 432 | /* safe the default decode mce callback */ | ||
| 433 | orig_mce_callback = x86_mce_decode_callback; | ||
| 434 | |||
| 435 | x86_mce_decode_callback = amd_decode_mce; | ||
| 436 | } | ||
| 437 | |||
| 438 | return 0; | ||
| 439 | } | ||
| 440 | early_initcall(mce_amd_init); | ||
| 441 | |||
| 442 | #ifdef MODULE | ||
| 443 | static void __exit mce_amd_exit(void) | ||
| 444 | { | ||
| 445 | x86_mce_decode_callback = orig_mce_callback; | ||
| 446 | } | ||
| 447 | |||
| 448 | MODULE_DESCRIPTION("AMD MCE decoder"); | ||
| 449 | MODULE_ALIAS("edac-mce-amd"); | ||
| 450 | MODULE_LICENSE("GPL"); | ||
| 451 | module_exit(mce_amd_exit); | ||
| 452 | #endif | ||
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 8e7b0ebece0c..5cae0b3eee9b 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -1556,8 +1556,6 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, | |||
| 1556 | struct drm_crtc *crtc; | 1556 | struct drm_crtc *crtc; |
| 1557 | int ret = 0; | 1557 | int ret = 0; |
| 1558 | 1558 | ||
| 1559 | DRM_DEBUG_KMS("\n"); | ||
| 1560 | |||
| 1561 | if (!req->flags) { | 1559 | if (!req->flags) { |
| 1562 | DRM_ERROR("no operation set\n"); | 1560 | DRM_ERROR("no operation set\n"); |
| 1563 | return -EINVAL; | 1561 | return -EINVAL; |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 819ddcbfcce5..23dc9c115fd9 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -454,6 +454,96 @@ out_free: | |||
| 454 | } | 454 | } |
| 455 | EXPORT_SYMBOL(drm_fb_helper_init_crtc_count); | 455 | EXPORT_SYMBOL(drm_fb_helper_init_crtc_count); |
| 456 | 456 | ||
| 457 | static void setcolreg(struct drm_crtc *crtc, u16 red, u16 green, | ||
| 458 | u16 blue, u16 regno, struct fb_info *info) | ||
| 459 | { | ||
| 460 | struct drm_fb_helper *fb_helper = info->par; | ||
| 461 | struct drm_framebuffer *fb = fb_helper->fb; | ||
| 462 | int pindex; | ||
| 463 | |||
| 464 | pindex = regno; | ||
| 465 | |||
| 466 | if (fb->bits_per_pixel == 16) { | ||
| 467 | pindex = regno << 3; | ||
| 468 | |||
| 469 | if (fb->depth == 16 && regno > 63) | ||
| 470 | return; | ||
| 471 | if (fb->depth == 15 && regno > 31) | ||
| 472 | return; | ||
| 473 | |||
| 474 | if (fb->depth == 16) { | ||
| 475 | u16 r, g, b; | ||
| 476 | int i; | ||
| 477 | if (regno < 32) { | ||
| 478 | for (i = 0; i < 8; i++) | ||
| 479 | fb_helper->funcs->gamma_set(crtc, red, | ||
| 480 | green, blue, pindex + i); | ||
| 481 | } | ||
| 482 | |||
| 483 | fb_helper->funcs->gamma_get(crtc, &r, | ||
| 484 | &g, &b, | ||
| 485 | pindex >> 1); | ||
| 486 | |||
| 487 | for (i = 0; i < 4; i++) | ||
| 488 | fb_helper->funcs->gamma_set(crtc, r, | ||
| 489 | green, b, | ||
| 490 | (pindex >> 1) + i); | ||
| 491 | } | ||
| 492 | } | ||
| 493 | |||
| 494 | if (fb->depth != 16) | ||
| 495 | fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); | ||
| 496 | |||
| 497 | if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) { | ||
| 498 | ((u32 *) fb->pseudo_palette)[regno] = | ||
| 499 | (regno << info->var.red.offset) | | ||
| 500 | (regno << info->var.green.offset) | | ||
| 501 | (regno << info->var.blue.offset); | ||
| 502 | } | ||
| 503 | } | ||
| 504 | |||
| 505 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | ||
| 506 | { | ||
| 507 | struct drm_fb_helper *fb_helper = info->par; | ||
| 508 | struct drm_device *dev = fb_helper->dev; | ||
| 509 | u16 *red, *green, *blue, *transp; | ||
| 510 | struct drm_crtc *crtc; | ||
| 511 | int i, rc = 0; | ||
| 512 | int start; | ||
| 513 | |||
| 514 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
| 515 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
| 516 | for (i = 0; i < fb_helper->crtc_count; i++) { | ||
| 517 | if (crtc->base.id == fb_helper->crtc_info[i].crtc_id) | ||
| 518 | break; | ||
| 519 | } | ||
| 520 | if (i == fb_helper->crtc_count) | ||
| 521 | continue; | ||
| 522 | |||
| 523 | red = cmap->red; | ||
| 524 | green = cmap->green; | ||
| 525 | blue = cmap->blue; | ||
| 526 | transp = cmap->transp; | ||
| 527 | start = cmap->start; | ||
| 528 | |||
| 529 | for (i = 0; i < cmap->len; i++) { | ||
| 530 | u16 hred, hgreen, hblue, htransp = 0xffff; | ||
| 531 | |||
| 532 | hred = *red++; | ||
| 533 | hgreen = *green++; | ||
| 534 | hblue = *blue++; | ||
| 535 | |||
| 536 | if (transp) | ||
| 537 | htransp = *transp++; | ||
| 538 | |||
| 539 | setcolreg(crtc, hred, hgreen, hblue, start++, info); | ||
| 540 | } | ||
| 541 | crtc_funcs->load_lut(crtc); | ||
| 542 | } | ||
| 543 | return rc; | ||
| 544 | } | ||
| 545 | EXPORT_SYMBOL(drm_fb_helper_setcmap); | ||
| 546 | |||
| 457 | int drm_fb_helper_setcolreg(unsigned regno, | 547 | int drm_fb_helper_setcolreg(unsigned regno, |
| 458 | unsigned red, | 548 | unsigned red, |
| 459 | unsigned green, | 549 | unsigned green, |
| @@ -466,9 +556,11 @@ int drm_fb_helper_setcolreg(unsigned regno, | |||
| 466 | struct drm_crtc *crtc; | 556 | struct drm_crtc *crtc; |
| 467 | int i; | 557 | int i; |
| 468 | 558 | ||
| 469 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 559 | if (regno > 255) |
| 470 | struct drm_framebuffer *fb = fb_helper->fb; | 560 | return 1; |
| 471 | 561 | ||
| 562 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
| 563 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
| 472 | for (i = 0; i < fb_helper->crtc_count; i++) { | 564 | for (i = 0; i < fb_helper->crtc_count; i++) { |
| 473 | if (crtc->base.id == fb_helper->crtc_info[i].crtc_id) | 565 | if (crtc->base.id == fb_helper->crtc_info[i].crtc_id) |
| 474 | break; | 566 | break; |
| @@ -476,35 +568,9 @@ int drm_fb_helper_setcolreg(unsigned regno, | |||
| 476 | if (i == fb_helper->crtc_count) | 568 | if (i == fb_helper->crtc_count) |
| 477 | continue; | 569 | continue; |
| 478 | 570 | ||
| 479 | if (regno > 255) | ||
| 480 | return 1; | ||
| 481 | |||
| 482 | if (fb->depth == 8) { | ||
| 483 | fb_helper->funcs->gamma_set(crtc, red, green, blue, regno); | ||
| 484 | return 0; | ||
| 485 | } | ||
| 486 | 571 | ||
| 487 | if (regno < 16) { | 572 | setcolreg(crtc, red, green, blue, regno, info); |
| 488 | switch (fb->depth) { | 573 | crtc_funcs->load_lut(crtc); |
| 489 | case 15: | ||
| 490 | fb->pseudo_palette[regno] = ((red & 0xf800) >> 1) | | ||
| 491 | ((green & 0xf800) >> 6) | | ||
| 492 | ((blue & 0xf800) >> 11); | ||
| 493 | break; | ||
| 494 | case 16: | ||
| 495 | fb->pseudo_palette[regno] = (red & 0xf800) | | ||
| 496 | ((green & 0xfc00) >> 5) | | ||
| 497 | ((blue & 0xf800) >> 11); | ||
| 498 | break; | ||
| 499 | case 24: | ||
| 500 | case 32: | ||
| 501 | fb->pseudo_palette[regno] = | ||
| 502 | (((red >> 8) & 0xff) << info->var.red.offset) | | ||
| 503 | (((green >> 8) & 0xff) << info->var.green.offset) | | ||
| 504 | (((blue >> 8) & 0xff) << info->var.blue.offset); | ||
| 505 | break; | ||
| 506 | } | ||
| 507 | } | ||
| 508 | } | 574 | } |
| 509 | return 0; | 575 | return 0; |
| 510 | } | 576 | } |
| @@ -674,6 +740,7 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, | |||
| 674 | EXPORT_SYMBOL(drm_fb_helper_pan_display); | 740 | EXPORT_SYMBOL(drm_fb_helper_pan_display); |
| 675 | 741 | ||
| 676 | int drm_fb_helper_single_fb_probe(struct drm_device *dev, | 742 | int drm_fb_helper_single_fb_probe(struct drm_device *dev, |
| 743 | int preferred_bpp, | ||
| 677 | int (*fb_create)(struct drm_device *dev, | 744 | int (*fb_create)(struct drm_device *dev, |
| 678 | uint32_t fb_width, | 745 | uint32_t fb_width, |
| 679 | uint32_t fb_height, | 746 | uint32_t fb_height, |
| @@ -696,6 +763,11 @@ int drm_fb_helper_single_fb_probe(struct drm_device *dev, | |||
| 696 | struct drm_fb_helper *fb_helper; | 763 | struct drm_fb_helper *fb_helper; |
| 697 | uint32_t surface_depth = 24, surface_bpp = 32; | 764 | uint32_t surface_depth = 24, surface_bpp = 32; |
| 698 | 765 | ||
| 766 | /* if driver picks 8 or 16 by default use that | ||
| 767 | for both depth/bpp */ | ||
| 768 | if (preferred_bpp != surface_bpp) { | ||
| 769 | surface_depth = surface_bpp = preferred_bpp; | ||
| 770 | } | ||
| 699 | /* first up get a count of crtcs now in use and new min/maxes width/heights */ | 771 | /* first up get a count of crtcs now in use and new min/maxes width/heights */ |
| 700 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | 772 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
| 701 | struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private; | 773 | struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private; |
| @@ -851,10 +923,12 @@ void drm_fb_helper_free(struct drm_fb_helper *helper) | |||
| 851 | } | 923 | } |
| 852 | EXPORT_SYMBOL(drm_fb_helper_free); | 924 | EXPORT_SYMBOL(drm_fb_helper_free); |
| 853 | 925 | ||
| 854 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch) | 926 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, |
| 927 | uint32_t depth) | ||
| 855 | { | 928 | { |
| 856 | info->fix.type = FB_TYPE_PACKED_PIXELS; | 929 | info->fix.type = FB_TYPE_PACKED_PIXELS; |
| 857 | info->fix.visual = FB_VISUAL_TRUECOLOR; | 930 | info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR : |
| 931 | FB_VISUAL_DIRECTCOLOR; | ||
| 858 | info->fix.type_aux = 0; | 932 | info->fix.type_aux = 0; |
| 859 | info->fix.xpanstep = 1; /* doing it in hw */ | 933 | info->fix.xpanstep = 1; /* doing it in hw */ |
| 860 | info->fix.ypanstep = 1; /* doing it in hw */ | 934 | info->fix.ypanstep = 1; /* doing it in hw */ |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 45d507ebd3ff..92aeb918e0c0 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1468,6 +1468,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1468 | spin_lock_init(&dev_priv->user_irq_lock); | 1468 | spin_lock_init(&dev_priv->user_irq_lock); |
| 1469 | spin_lock_init(&dev_priv->error_lock); | 1469 | spin_lock_init(&dev_priv->error_lock); |
| 1470 | dev_priv->user_irq_refcount = 0; | 1470 | dev_priv->user_irq_refcount = 0; |
| 1471 | dev_priv->trace_irq_seqno = 0; | ||
| 1471 | 1472 | ||
| 1472 | ret = drm_vblank_init(dev, I915_NUM_PIPE); | 1473 | ret = drm_vblank_init(dev, I915_NUM_PIPE); |
| 1473 | 1474 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index b24b2d145b75..6035d3dae851 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -202,6 +202,7 @@ typedef struct drm_i915_private { | |||
| 202 | spinlock_t user_irq_lock; | 202 | spinlock_t user_irq_lock; |
| 203 | /** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */ | 203 | /** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */ |
| 204 | int user_irq_refcount; | 204 | int user_irq_refcount; |
| 205 | u32 trace_irq_seqno; | ||
| 205 | /** Cached value of IMR to avoid reads in updating the bitfield */ | 206 | /** Cached value of IMR to avoid reads in updating the bitfield */ |
| 206 | u32 irq_mask_reg; | 207 | u32 irq_mask_reg; |
| 207 | u32 pipestat[2]; | 208 | u32 pipestat[2]; |
| @@ -665,6 +666,7 @@ extern int i915_irq_emit(struct drm_device *dev, void *data, | |||
| 665 | extern int i915_irq_wait(struct drm_device *dev, void *data, | 666 | extern int i915_irq_wait(struct drm_device *dev, void *data, |
| 666 | struct drm_file *file_priv); | 667 | struct drm_file *file_priv); |
| 667 | void i915_user_irq_get(struct drm_device *dev); | 668 | void i915_user_irq_get(struct drm_device *dev); |
| 669 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno); | ||
| 668 | void i915_user_irq_put(struct drm_device *dev); | 670 | void i915_user_irq_put(struct drm_device *dev); |
| 669 | extern void i915_enable_interrupt (struct drm_device *dev); | 671 | extern void i915_enable_interrupt (struct drm_device *dev); |
| 670 | 672 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 40727d4c2919..abfc27b0c2ea 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1770,7 +1770,7 @@ i915_gem_retire_requests(struct drm_device *dev) | |||
| 1770 | drm_i915_private_t *dev_priv = dev->dev_private; | 1770 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 1771 | uint32_t seqno; | 1771 | uint32_t seqno; |
| 1772 | 1772 | ||
| 1773 | if (!dev_priv->hw_status_page) | 1773 | if (!dev_priv->hw_status_page || list_empty(&dev_priv->mm.request_list)) |
| 1774 | return; | 1774 | return; |
| 1775 | 1775 | ||
| 1776 | seqno = i915_get_gem_seqno(dev); | 1776 | seqno = i915_get_gem_seqno(dev); |
| @@ -1794,6 +1794,12 @@ i915_gem_retire_requests(struct drm_device *dev) | |||
| 1794 | } else | 1794 | } else |
| 1795 | break; | 1795 | break; |
| 1796 | } | 1796 | } |
| 1797 | |||
| 1798 | if (unlikely (dev_priv->trace_irq_seqno && | ||
| 1799 | i915_seqno_passed(dev_priv->trace_irq_seqno, seqno))) { | ||
| 1800 | i915_user_irq_put(dev); | ||
| 1801 | dev_priv->trace_irq_seqno = 0; | ||
| 1802 | } | ||
| 1797 | } | 1803 | } |
| 1798 | 1804 | ||
| 1799 | void | 1805 | void |
| @@ -3352,7 +3358,7 @@ i915_dispatch_gem_execbuffer(struct drm_device *dev, | |||
| 3352 | exec_start = (uint32_t) exec_offset + exec->batch_start_offset; | 3358 | exec_start = (uint32_t) exec_offset + exec->batch_start_offset; |
| 3353 | exec_len = (uint32_t) exec->batch_len; | 3359 | exec_len = (uint32_t) exec->batch_len; |
| 3354 | 3360 | ||
| 3355 | trace_i915_gem_request_submit(dev, dev_priv->mm.next_gem_seqno); | 3361 | trace_i915_gem_request_submit(dev, dev_priv->mm.next_gem_seqno + 1); |
| 3356 | 3362 | ||
| 3357 | count = nbox ? nbox : 1; | 3363 | count = nbox ? nbox : 1; |
| 3358 | 3364 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 4dfeec7cdd42..c3ceffa46ea0 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -725,6 +725,16 @@ void i915_user_irq_put(struct drm_device *dev) | |||
| 725 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); | 725 | spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); |
| 726 | } | 726 | } |
| 727 | 727 | ||
| 728 | void i915_trace_irq_get(struct drm_device *dev, u32 seqno) | ||
| 729 | { | ||
| 730 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | ||
| 731 | |||
| 732 | if (dev_priv->trace_irq_seqno == 0) | ||
| 733 | i915_user_irq_get(dev); | ||
| 734 | |||
| 735 | dev_priv->trace_irq_seqno = seqno; | ||
| 736 | } | ||
| 737 | |||
| 728 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) | 738 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) |
| 729 | { | 739 | { |
| 730 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 740 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index 5567a40816f3..01840d9bc38f 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h | |||
| @@ -158,16 +158,17 @@ TRACE_EVENT(i915_gem_request_submit, | |||
| 158 | TP_ARGS(dev, seqno), | 158 | TP_ARGS(dev, seqno), |
| 159 | 159 | ||
| 160 | TP_STRUCT__entry( | 160 | TP_STRUCT__entry( |
| 161 | __field(struct drm_device *, dev) | 161 | __field(u32, dev) |
| 162 | __field(u32, seqno) | 162 | __field(u32, seqno) |
| 163 | ), | 163 | ), |
| 164 | 164 | ||
| 165 | TP_fast_assign( | 165 | TP_fast_assign( |
| 166 | __entry->dev = dev; | 166 | __entry->dev = dev->primary->index; |
| 167 | __entry->seqno = seqno; | 167 | __entry->seqno = seqno; |
| 168 | i915_trace_irq_get(dev, seqno); | ||
| 168 | ), | 169 | ), |
| 169 | 170 | ||
| 170 | TP_printk("dev=%p, seqno=%u", __entry->dev, __entry->seqno) | 171 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) |
| 171 | ); | 172 | ); |
| 172 | 173 | ||
| 173 | TRACE_EVENT(i915_gem_request_flush, | 174 | TRACE_EVENT(i915_gem_request_flush, |
| @@ -178,20 +179,20 @@ TRACE_EVENT(i915_gem_request_flush, | |||
| 178 | TP_ARGS(dev, seqno, flush_domains, invalidate_domains), | 179 | TP_ARGS(dev, seqno, flush_domains, invalidate_domains), |
| 179 | 180 | ||
| 180 | TP_STRUCT__entry( | 181 | TP_STRUCT__entry( |
| 181 | __field(struct drm_device *, dev) | 182 | __field(u32, dev) |
| 182 | __field(u32, seqno) | 183 | __field(u32, seqno) |
| 183 | __field(u32, flush_domains) | 184 | __field(u32, flush_domains) |
| 184 | __field(u32, invalidate_domains) | 185 | __field(u32, invalidate_domains) |
| 185 | ), | 186 | ), |
| 186 | 187 | ||
| 187 | TP_fast_assign( | 188 | TP_fast_assign( |
| 188 | __entry->dev = dev; | 189 | __entry->dev = dev->primary->index; |
| 189 | __entry->seqno = seqno; | 190 | __entry->seqno = seqno; |
| 190 | __entry->flush_domains = flush_domains; | 191 | __entry->flush_domains = flush_domains; |
| 191 | __entry->invalidate_domains = invalidate_domains; | 192 | __entry->invalidate_domains = invalidate_domains; |
| 192 | ), | 193 | ), |
| 193 | 194 | ||
| 194 | TP_printk("dev=%p, seqno=%u, flush=%04x, invalidate=%04x", | 195 | TP_printk("dev=%u, seqno=%u, flush=%04x, invalidate=%04x", |
| 195 | __entry->dev, __entry->seqno, | 196 | __entry->dev, __entry->seqno, |
| 196 | __entry->flush_domains, __entry->invalidate_domains) | 197 | __entry->flush_domains, __entry->invalidate_domains) |
| 197 | ); | 198 | ); |
| @@ -204,16 +205,16 @@ TRACE_EVENT(i915_gem_request_complete, | |||
| 204 | TP_ARGS(dev, seqno), | 205 | TP_ARGS(dev, seqno), |
| 205 | 206 | ||
| 206 | TP_STRUCT__entry( | 207 | TP_STRUCT__entry( |
| 207 | __field(struct drm_device *, dev) | 208 | __field(u32, dev) |
| 208 | __field(u32, seqno) | 209 | __field(u32, seqno) |
| 209 | ), | 210 | ), |
| 210 | 211 | ||
| 211 | TP_fast_assign( | 212 | TP_fast_assign( |
| 212 | __entry->dev = dev; | 213 | __entry->dev = dev->primary->index; |
| 213 | __entry->seqno = seqno; | 214 | __entry->seqno = seqno; |
| 214 | ), | 215 | ), |
| 215 | 216 | ||
| 216 | TP_printk("dev=%p, seqno=%u", __entry->dev, __entry->seqno) | 217 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) |
| 217 | ); | 218 | ); |
| 218 | 219 | ||
| 219 | TRACE_EVENT(i915_gem_request_retire, | 220 | TRACE_EVENT(i915_gem_request_retire, |
| @@ -223,16 +224,16 @@ TRACE_EVENT(i915_gem_request_retire, | |||
| 223 | TP_ARGS(dev, seqno), | 224 | TP_ARGS(dev, seqno), |
| 224 | 225 | ||
| 225 | TP_STRUCT__entry( | 226 | TP_STRUCT__entry( |
| 226 | __field(struct drm_device *, dev) | 227 | __field(u32, dev) |
| 227 | __field(u32, seqno) | 228 | __field(u32, seqno) |
| 228 | ), | 229 | ), |
| 229 | 230 | ||
| 230 | TP_fast_assign( | 231 | TP_fast_assign( |
| 231 | __entry->dev = dev; | 232 | __entry->dev = dev->primary->index; |
| 232 | __entry->seqno = seqno; | 233 | __entry->seqno = seqno; |
| 233 | ), | 234 | ), |
| 234 | 235 | ||
| 235 | TP_printk("dev=%p, seqno=%u", __entry->dev, __entry->seqno) | 236 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) |
| 236 | ); | 237 | ); |
| 237 | 238 | ||
| 238 | TRACE_EVENT(i915_gem_request_wait_begin, | 239 | TRACE_EVENT(i915_gem_request_wait_begin, |
| @@ -242,16 +243,16 @@ TRACE_EVENT(i915_gem_request_wait_begin, | |||
| 242 | TP_ARGS(dev, seqno), | 243 | TP_ARGS(dev, seqno), |
| 243 | 244 | ||
| 244 | TP_STRUCT__entry( | 245 | TP_STRUCT__entry( |
| 245 | __field(struct drm_device *, dev) | 246 | __field(u32, dev) |
| 246 | __field(u32, seqno) | 247 | __field(u32, seqno) |
| 247 | ), | 248 | ), |
| 248 | 249 | ||
| 249 | TP_fast_assign( | 250 | TP_fast_assign( |
| 250 | __entry->dev = dev; | 251 | __entry->dev = dev->primary->index; |
| 251 | __entry->seqno = seqno; | 252 | __entry->seqno = seqno; |
| 252 | ), | 253 | ), |
| 253 | 254 | ||
| 254 | TP_printk("dev=%p, seqno=%u", __entry->dev, __entry->seqno) | 255 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) |
| 255 | ); | 256 | ); |
| 256 | 257 | ||
| 257 | TRACE_EVENT(i915_gem_request_wait_end, | 258 | TRACE_EVENT(i915_gem_request_wait_end, |
| @@ -261,16 +262,16 @@ TRACE_EVENT(i915_gem_request_wait_end, | |||
| 261 | TP_ARGS(dev, seqno), | 262 | TP_ARGS(dev, seqno), |
| 262 | 263 | ||
| 263 | TP_STRUCT__entry( | 264 | TP_STRUCT__entry( |
| 264 | __field(struct drm_device *, dev) | 265 | __field(u32, dev) |
| 265 | __field(u32, seqno) | 266 | __field(u32, seqno) |
| 266 | ), | 267 | ), |
| 267 | 268 | ||
| 268 | TP_fast_assign( | 269 | TP_fast_assign( |
| 269 | __entry->dev = dev; | 270 | __entry->dev = dev->primary->index; |
| 270 | __entry->seqno = seqno; | 271 | __entry->seqno = seqno; |
| 271 | ), | 272 | ), |
| 272 | 273 | ||
| 273 | TP_printk("dev=%p, seqno=%u", __entry->dev, __entry->seqno) | 274 | TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) |
| 274 | ); | 275 | ); |
| 275 | 276 | ||
| 276 | TRACE_EVENT(i915_ring_wait_begin, | 277 | TRACE_EVENT(i915_ring_wait_begin, |
| @@ -280,14 +281,14 @@ TRACE_EVENT(i915_ring_wait_begin, | |||
| 280 | TP_ARGS(dev), | 281 | TP_ARGS(dev), |
| 281 | 282 | ||
| 282 | TP_STRUCT__entry( | 283 | TP_STRUCT__entry( |
| 283 | __field(struct drm_device *, dev) | 284 | __field(u32, dev) |
| 284 | ), | 285 | ), |
| 285 | 286 | ||
| 286 | TP_fast_assign( | 287 | TP_fast_assign( |
| 287 | __entry->dev = dev; | 288 | __entry->dev = dev->primary->index; |
| 288 | ), | 289 | ), |
| 289 | 290 | ||
| 290 | TP_printk("dev=%p", __entry->dev) | 291 | TP_printk("dev=%u", __entry->dev) |
| 291 | ); | 292 | ); |
| 292 | 293 | ||
| 293 | TRACE_EVENT(i915_ring_wait_end, | 294 | TRACE_EVENT(i915_ring_wait_end, |
| @@ -297,14 +298,14 @@ TRACE_EVENT(i915_ring_wait_end, | |||
| 297 | TP_ARGS(dev), | 298 | TP_ARGS(dev), |
| 298 | 299 | ||
| 299 | TP_STRUCT__entry( | 300 | TP_STRUCT__entry( |
| 300 | __field(struct drm_device *, dev) | 301 | __field(u32, dev) |
| 301 | ), | 302 | ), |
| 302 | 303 | ||
| 303 | TP_fast_assign( | 304 | TP_fast_assign( |
| 304 | __entry->dev = dev; | 305 | __entry->dev = dev->primary->index; |
| 305 | ), | 306 | ), |
| 306 | 307 | ||
| 307 | TP_printk("dev=%p", __entry->dev) | 308 | TP_printk("dev=%u", __entry->dev) |
| 308 | ); | 309 | ); |
| 309 | 310 | ||
| 310 | #endif /* _I915_TRACE_H_ */ | 311 | #endif /* _I915_TRACE_H_ */ |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 93ff6c03733e..3c14240cc002 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -3095,7 +3095,6 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 3095 | struct drm_gem_object *bo; | 3095 | struct drm_gem_object *bo; |
| 3096 | struct drm_i915_gem_object *obj_priv; | 3096 | struct drm_i915_gem_object *obj_priv; |
| 3097 | int pipe = intel_crtc->pipe; | 3097 | int pipe = intel_crtc->pipe; |
| 3098 | int plane = intel_crtc->plane; | ||
| 3099 | uint32_t control = (pipe == 0) ? CURACNTR : CURBCNTR; | 3098 | uint32_t control = (pipe == 0) ? CURACNTR : CURBCNTR; |
| 3100 | uint32_t base = (pipe == 0) ? CURABASE : CURBBASE; | 3099 | uint32_t base = (pipe == 0) ? CURABASE : CURBBASE; |
| 3101 | uint32_t temp = I915_READ(control); | 3100 | uint32_t temp = I915_READ(control); |
| @@ -3182,9 +3181,6 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 3182 | drm_gem_object_unreference(intel_crtc->cursor_bo); | 3181 | drm_gem_object_unreference(intel_crtc->cursor_bo); |
| 3183 | } | 3182 | } |
| 3184 | 3183 | ||
| 3185 | if ((IS_I965G(dev) || plane == 0)) | ||
| 3186 | intel_update_fbc(crtc, &crtc->mode); | ||
| 3187 | |||
| 3188 | mutex_unlock(&dev->struct_mutex); | 3184 | mutex_unlock(&dev->struct_mutex); |
| 3189 | 3185 | ||
| 3190 | intel_crtc->cursor_addr = addr; | 3186 | intel_crtc->cursor_addr = addr; |
| @@ -3244,6 +3240,16 @@ void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | |||
| 3244 | intel_crtc->lut_b[regno] = blue >> 8; | 3240 | intel_crtc->lut_b[regno] = blue >> 8; |
| 3245 | } | 3241 | } |
| 3246 | 3242 | ||
| 3243 | void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
| 3244 | u16 *blue, int regno) | ||
| 3245 | { | ||
| 3246 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
| 3247 | |||
| 3248 | *red = intel_crtc->lut_r[regno] << 8; | ||
| 3249 | *green = intel_crtc->lut_g[regno] << 8; | ||
| 3250 | *blue = intel_crtc->lut_b[regno] << 8; | ||
| 3251 | } | ||
| 3252 | |||
| 3247 | static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, | 3253 | static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
| 3248 | u16 *blue, uint32_t size) | 3254 | u16 *blue, uint32_t size) |
| 3249 | { | 3255 | { |
| @@ -3835,6 +3841,7 @@ static const struct drm_crtc_helper_funcs intel_helper_funcs = { | |||
| 3835 | .mode_set_base = intel_pipe_set_base, | 3841 | .mode_set_base = intel_pipe_set_base, |
| 3836 | .prepare = intel_crtc_prepare, | 3842 | .prepare = intel_crtc_prepare, |
| 3837 | .commit = intel_crtc_commit, | 3843 | .commit = intel_crtc_commit, |
| 3844 | .load_lut = intel_crtc_load_lut, | ||
| 3838 | }; | 3845 | }; |
| 3839 | 3846 | ||
| 3840 | static const struct drm_crtc_funcs intel_crtc_funcs = { | 3847 | static const struct drm_crtc_funcs intel_crtc_funcs = { |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 8aa4b7f30daa..ef61fe9507e2 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -175,6 +175,8 @@ extern int intelfb_resize(struct drm_device *dev, struct drm_crtc *crtc); | |||
| 175 | extern void intelfb_restore(void); | 175 | extern void intelfb_restore(void); |
| 176 | extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 176 | extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
| 177 | u16 blue, int regno); | 177 | u16 blue, int regno); |
| 178 | extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
| 179 | u16 *blue, int regno); | ||
| 178 | 180 | ||
| 179 | extern int intel_framebuffer_create(struct drm_device *dev, | 181 | extern int intel_framebuffer_create(struct drm_device *dev, |
| 180 | struct drm_mode_fb_cmd *mode_cmd, | 182 | struct drm_mode_fb_cmd *mode_cmd, |
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c index e85d7e9eed7d..2b0fe54cd92c 100644 --- a/drivers/gpu/drm/i915/intel_fb.c +++ b/drivers/gpu/drm/i915/intel_fb.c | |||
| @@ -60,10 +60,12 @@ static struct fb_ops intelfb_ops = { | |||
| 60 | .fb_imageblit = cfb_imageblit, | 60 | .fb_imageblit = cfb_imageblit, |
| 61 | .fb_pan_display = drm_fb_helper_pan_display, | 61 | .fb_pan_display = drm_fb_helper_pan_display, |
| 62 | .fb_blank = drm_fb_helper_blank, | 62 | .fb_blank = drm_fb_helper_blank, |
| 63 | .fb_setcmap = drm_fb_helper_setcmap, | ||
| 63 | }; | 64 | }; |
| 64 | 65 | ||
| 65 | static struct drm_fb_helper_funcs intel_fb_helper_funcs = { | 66 | static struct drm_fb_helper_funcs intel_fb_helper_funcs = { |
| 66 | .gamma_set = intel_crtc_fb_gamma_set, | 67 | .gamma_set = intel_crtc_fb_gamma_set, |
| 68 | .gamma_get = intel_crtc_fb_gamma_get, | ||
| 67 | }; | 69 | }; |
| 68 | 70 | ||
| 69 | 71 | ||
| @@ -123,6 +125,10 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width, | |||
| 123 | struct device *device = &dev->pdev->dev; | 125 | struct device *device = &dev->pdev->dev; |
| 124 | int size, ret, mmio_bar = IS_I9XX(dev) ? 0 : 1; | 126 | int size, ret, mmio_bar = IS_I9XX(dev) ? 0 : 1; |
| 125 | 127 | ||
| 128 | /* we don't do packed 24bpp */ | ||
| 129 | if (surface_bpp == 24) | ||
| 130 | surface_bpp = 32; | ||
| 131 | |||
| 126 | mode_cmd.width = surface_width; | 132 | mode_cmd.width = surface_width; |
| 127 | mode_cmd.height = surface_height; | 133 | mode_cmd.height = surface_height; |
| 128 | 134 | ||
| @@ -206,7 +212,7 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width, | |||
| 206 | 212 | ||
| 207 | // memset(info->screen_base, 0, size); | 213 | // memset(info->screen_base, 0, size); |
| 208 | 214 | ||
| 209 | drm_fb_helper_fill_fix(info, fb->pitch); | 215 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); |
| 210 | drm_fb_helper_fill_var(info, fb, fb_width, fb_height); | 216 | drm_fb_helper_fill_var(info, fb, fb_width, fb_height); |
| 211 | 217 | ||
| 212 | /* FIXME: we really shouldn't expose mmio space at all */ | 218 | /* FIXME: we really shouldn't expose mmio space at all */ |
| @@ -244,7 +250,7 @@ int intelfb_probe(struct drm_device *dev) | |||
| 244 | int ret; | 250 | int ret; |
| 245 | 251 | ||
| 246 | DRM_DEBUG("\n"); | 252 | DRM_DEBUG("\n"); |
| 247 | ret = drm_fb_helper_single_fb_probe(dev, intelfb_create); | 253 | ret = drm_fb_helper_single_fb_probe(dev, 32, intelfb_create); |
| 248 | return ret; | 254 | return ret; |
| 249 | } | 255 | } |
| 250 | EXPORT_SYMBOL(intelfb_probe); | 256 | EXPORT_SYMBOL(intelfb_probe); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index fa304e136010..663ab6de0b58 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -223,7 +223,7 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) | |||
| 223 | 223 | ||
| 224 | connector = &intel_output->base; | 224 | connector = &intel_output->base; |
| 225 | drm_connector_init(dev, connector, &intel_hdmi_connector_funcs, | 225 | drm_connector_init(dev, connector, &intel_hdmi_connector_funcs, |
| 226 | DRM_MODE_CONNECTOR_DVID); | 226 | DRM_MODE_CONNECTOR_HDMIA); |
| 227 | drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs); | 227 | drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs); |
| 228 | 228 | ||
| 229 | intel_output->type = INTEL_OUTPUT_HDMI; | 229 | intel_output->type = INTEL_OUTPUT_HDMI; |
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c index c64eab493fb0..9ca917931afb 100644 --- a/drivers/gpu/drm/i915/intel_tv.c +++ b/drivers/gpu/drm/i915/intel_tv.c | |||
| @@ -1082,7 +1082,8 @@ intel_tv_mode_valid(struct drm_connector *connector, struct drm_display_mode *mo | |||
| 1082 | const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output); | 1082 | const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output); |
| 1083 | 1083 | ||
| 1084 | /* Ensure TV refresh is close to desired refresh */ | 1084 | /* Ensure TV refresh is close to desired refresh */ |
| 1085 | if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode)) < 10) | 1085 | if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode) * 1000) |
| 1086 | < 1000) | ||
| 1086 | return MODE_OK; | 1087 | return MODE_OK; |
| 1087 | return MODE_CLOCK_RANGE; | 1088 | return MODE_CLOCK_RANGE; |
| 1088 | } | 1089 | } |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 6a015929deee..14fa9701aeb3 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -733,6 +733,7 @@ static const struct drm_crtc_helper_funcs atombios_helper_funcs = { | |||
| 733 | .mode_set_base = atombios_crtc_set_base, | 733 | .mode_set_base = atombios_crtc_set_base, |
| 734 | .prepare = atombios_crtc_prepare, | 734 | .prepare = atombios_crtc_prepare, |
| 735 | .commit = atombios_crtc_commit, | 735 | .commit = atombios_crtc_commit, |
| 736 | .load_lut = radeon_crtc_load_lut, | ||
| 736 | }; | 737 | }; |
| 737 | 738 | ||
| 738 | void radeon_atombios_init_crtc(struct drm_device *dev, | 739 | void radeon_atombios_init_crtc(struct drm_device *dev, |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index e6cce24de802..161094c07d94 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -32,6 +32,9 @@ | |||
| 32 | #include "radeon_reg.h" | 32 | #include "radeon_reg.h" |
| 33 | #include "radeon.h" | 33 | #include "radeon.h" |
| 34 | #include "r100d.h" | 34 | #include "r100d.h" |
| 35 | #include "rs100d.h" | ||
| 36 | #include "rv200d.h" | ||
| 37 | #include "rv250d.h" | ||
| 35 | 38 | ||
| 36 | #include <linux/firmware.h> | 39 | #include <linux/firmware.h> |
| 37 | #include <linux/platform_device.h> | 40 | #include <linux/platform_device.h> |
| @@ -60,18 +63,7 @@ MODULE_FIRMWARE(FIRMWARE_R520); | |||
| 60 | 63 | ||
| 61 | /* This files gather functions specifics to: | 64 | /* This files gather functions specifics to: |
| 62 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 65 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
| 63 | * | ||
| 64 | * Some of these functions might be used by newer ASICs. | ||
| 65 | */ | 66 | */ |
| 66 | int r200_init(struct radeon_device *rdev); | ||
| 67 | void r100_hdp_reset(struct radeon_device *rdev); | ||
| 68 | void r100_gpu_init(struct radeon_device *rdev); | ||
| 69 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
| 70 | int r100_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 71 | void r100_gpu_wait_for_vsync(struct radeon_device *rdev); | ||
| 72 | void r100_gpu_wait_for_vsync2(struct radeon_device *rdev); | ||
| 73 | int r100_debugfs_mc_info_init(struct radeon_device *rdev); | ||
| 74 | |||
| 75 | 67 | ||
| 76 | /* | 68 | /* |
| 77 | * PCI GART | 69 | * PCI GART |
| @@ -152,136 +144,6 @@ void r100_pci_gart_fini(struct radeon_device *rdev) | |||
| 152 | radeon_gart_fini(rdev); | 144 | radeon_gart_fini(rdev); |
| 153 | } | 145 | } |
| 154 | 146 | ||
| 155 | |||
| 156 | /* | ||
| 157 | * MC | ||
| 158 | */ | ||
| 159 | void r100_mc_disable_clients(struct radeon_device *rdev) | ||
| 160 | { | ||
| 161 | uint32_t ov0_scale_cntl, crtc_ext_cntl, crtc_gen_cntl, crtc2_gen_cntl; | ||
| 162 | |||
| 163 | /* FIXME: is this function correct for rs100,rs200,rs300 ? */ | ||
| 164 | if (r100_gui_wait_for_idle(rdev)) { | ||
| 165 | printk(KERN_WARNING "Failed to wait GUI idle while " | ||
| 166 | "programming pipes. Bad things might happen.\n"); | ||
| 167 | } | ||
| 168 | |||
| 169 | /* stop display and memory access */ | ||
| 170 | ov0_scale_cntl = RREG32(RADEON_OV0_SCALE_CNTL); | ||
| 171 | WREG32(RADEON_OV0_SCALE_CNTL, ov0_scale_cntl & ~RADEON_SCALER_ENABLE); | ||
| 172 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); | ||
| 173 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl | RADEON_CRTC_DISPLAY_DIS); | ||
| 174 | crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL); | ||
| 175 | |||
| 176 | r100_gpu_wait_for_vsync(rdev); | ||
| 177 | |||
| 178 | WREG32(RADEON_CRTC_GEN_CNTL, | ||
| 179 | (crtc_gen_cntl & ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_ICON_EN)) | | ||
| 180 | RADEON_CRTC_DISP_REQ_EN_B | RADEON_CRTC_EXT_DISP_EN); | ||
| 181 | |||
| 182 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { | ||
| 183 | crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); | ||
| 184 | |||
| 185 | r100_gpu_wait_for_vsync2(rdev); | ||
| 186 | WREG32(RADEON_CRTC2_GEN_CNTL, | ||
| 187 | (crtc2_gen_cntl & | ||
| 188 | ~(RADEON_CRTC2_CUR_EN | RADEON_CRTC2_ICON_EN)) | | ||
| 189 | RADEON_CRTC2_DISP_REQ_EN_B); | ||
| 190 | } | ||
| 191 | |||
| 192 | udelay(500); | ||
| 193 | } | ||
| 194 | |||
| 195 | void r100_mc_setup(struct radeon_device *rdev) | ||
| 196 | { | ||
| 197 | uint32_t tmp; | ||
| 198 | int r; | ||
| 199 | |||
| 200 | r = r100_debugfs_mc_info_init(rdev); | ||
| 201 | if (r) { | ||
| 202 | DRM_ERROR("Failed to register debugfs file for R100 MC !\n"); | ||
| 203 | } | ||
| 204 | /* Write VRAM size in case we are limiting it */ | ||
| 205 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | ||
| 206 | /* Novell bug 204882 for RN50/M6/M7 with 8/16/32MB VRAM, | ||
| 207 | * if the aperture is 64MB but we have 32MB VRAM | ||
| 208 | * we report only 32MB VRAM but we have to set MC_FB_LOCATION | ||
| 209 | * to 64MB, otherwise the gpu accidentially dies */ | ||
| 210 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
| 211 | tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16); | ||
| 212 | tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16); | ||
| 213 | WREG32(RADEON_MC_FB_LOCATION, tmp); | ||
| 214 | |||
| 215 | /* Enable bus mastering */ | ||
| 216 | tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; | ||
| 217 | WREG32(RADEON_BUS_CNTL, tmp); | ||
| 218 | |||
| 219 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 220 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | ||
| 221 | tmp = REG_SET(RADEON_MC_AGP_TOP, tmp >> 16); | ||
| 222 | tmp |= REG_SET(RADEON_MC_AGP_START, rdev->mc.gtt_location >> 16); | ||
| 223 | WREG32(RADEON_MC_AGP_LOCATION, tmp); | ||
| 224 | WREG32(RADEON_AGP_BASE, rdev->mc.agp_base); | ||
| 225 | } else { | ||
| 226 | WREG32(RADEON_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
| 227 | WREG32(RADEON_AGP_BASE, 0); | ||
| 228 | } | ||
| 229 | |||
| 230 | tmp = RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL; | ||
| 231 | tmp |= (7 << 28); | ||
| 232 | WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
| 233 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
| 234 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | ||
| 235 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
| 236 | } | ||
| 237 | |||
| 238 | int r100_mc_init(struct radeon_device *rdev) | ||
| 239 | { | ||
| 240 | int r; | ||
| 241 | |||
| 242 | if (r100_debugfs_rbbm_init(rdev)) { | ||
| 243 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
| 244 | } | ||
| 245 | |||
| 246 | r100_gpu_init(rdev); | ||
| 247 | /* Disable gart which also disable out of gart access */ | ||
| 248 | r100_pci_gart_disable(rdev); | ||
| 249 | |||
| 250 | /* Setup GPU memory space */ | ||
| 251 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
| 252 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 253 | r = radeon_agp_init(rdev); | ||
| 254 | if (r) { | ||
| 255 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
| 256 | rdev->flags &= ~RADEON_IS_AGP; | ||
| 257 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
| 258 | } else { | ||
| 259 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
| 260 | } | ||
| 261 | } | ||
| 262 | r = radeon_mc_setup(rdev); | ||
| 263 | if (r) { | ||
| 264 | return r; | ||
| 265 | } | ||
| 266 | |||
| 267 | r100_mc_disable_clients(rdev); | ||
| 268 | if (r100_mc_wait_for_idle(rdev)) { | ||
| 269 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
| 270 | "programming pipes. Bad things might happen.\n"); | ||
| 271 | } | ||
| 272 | |||
| 273 | r100_mc_setup(rdev); | ||
| 274 | return 0; | ||
| 275 | } | ||
| 276 | |||
| 277 | void r100_mc_fini(struct radeon_device *rdev) | ||
| 278 | { | ||
| 279 | } | ||
| 280 | |||
| 281 | |||
| 282 | /* | ||
| 283 | * Interrupts | ||
| 284 | */ | ||
| 285 | int r100_irq_set(struct radeon_device *rdev) | 147 | int r100_irq_set(struct radeon_device *rdev) |
| 286 | { | 148 | { |
| 287 | uint32_t tmp = 0; | 149 | uint32_t tmp = 0; |
| @@ -358,10 +220,6 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | |||
| 358 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | 220 | return RREG32(RADEON_CRTC2_CRNT_FRAME); |
| 359 | } | 221 | } |
| 360 | 222 | ||
| 361 | |||
| 362 | /* | ||
| 363 | * Fence emission | ||
| 364 | */ | ||
| 365 | void r100_fence_ring_emit(struct radeon_device *rdev, | 223 | void r100_fence_ring_emit(struct radeon_device *rdev, |
| 366 | struct radeon_fence *fence) | 224 | struct radeon_fence *fence) |
| 367 | { | 225 | { |
| @@ -377,10 +235,6 @@ void r100_fence_ring_emit(struct radeon_device *rdev, | |||
| 377 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); | 235 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
| 378 | } | 236 | } |
| 379 | 237 | ||
| 380 | |||
| 381 | /* | ||
| 382 | * Writeback | ||
| 383 | */ | ||
| 384 | int r100_wb_init(struct radeon_device *rdev) | 238 | int r100_wb_init(struct radeon_device *rdev) |
| 385 | { | 239 | { |
| 386 | int r; | 240 | int r; |
| @@ -504,10 +358,6 @@ int r100_copy_blit(struct radeon_device *rdev, | |||
| 504 | return r; | 358 | return r; |
| 505 | } | 359 | } |
| 506 | 360 | ||
| 507 | |||
| 508 | /* | ||
| 509 | * CP | ||
| 510 | */ | ||
| 511 | static int r100_cp_wait_for_idle(struct radeon_device *rdev) | 361 | static int r100_cp_wait_for_idle(struct radeon_device *rdev) |
| 512 | { | 362 | { |
| 513 | unsigned i; | 363 | unsigned i; |
| @@ -612,6 +462,7 @@ static int r100_cp_init_microcode(struct radeon_device *rdev) | |||
| 612 | } | 462 | } |
| 613 | return err; | 463 | return err; |
| 614 | } | 464 | } |
| 465 | |||
| 615 | static void r100_cp_load_microcode(struct radeon_device *rdev) | 466 | static void r100_cp_load_microcode(struct radeon_device *rdev) |
| 616 | { | 467 | { |
| 617 | const __be32 *fw_data; | 468 | const __be32 *fw_data; |
| @@ -978,7 +829,7 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) | |||
| 978 | 829 | ||
| 979 | header = radeon_get_ib_value(p, h_idx); | 830 | header = radeon_get_ib_value(p, h_idx); |
| 980 | crtc_id = radeon_get_ib_value(p, h_idx + 5); | 831 | crtc_id = radeon_get_ib_value(p, h_idx + 5); |
| 981 | reg = header >> 2; | 832 | reg = CP_PACKET0_GET_REG(header); |
| 982 | mutex_lock(&p->rdev->ddev->mode_config.mutex); | 833 | mutex_lock(&p->rdev->ddev->mode_config.mutex); |
| 983 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); | 834 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); |
| 984 | if (!obj) { | 835 | if (!obj) { |
| @@ -1990,7 +1841,7 @@ void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 1990 | r100_pll_errata_after_data(rdev); | 1841 | r100_pll_errata_after_data(rdev); |
| 1991 | } | 1842 | } |
| 1992 | 1843 | ||
| 1993 | int r100_init(struct radeon_device *rdev) | 1844 | void r100_set_safe_registers(struct radeon_device *rdev) |
| 1994 | { | 1845 | { |
| 1995 | if (ASIC_IS_RN50(rdev)) { | 1846 | if (ASIC_IS_RN50(rdev)) { |
| 1996 | rdev->config.r100.reg_safe_bm = rn50_reg_safe_bm; | 1847 | rdev->config.r100.reg_safe_bm = rn50_reg_safe_bm; |
| @@ -1999,9 +1850,8 @@ int r100_init(struct radeon_device *rdev) | |||
| 1999 | rdev->config.r100.reg_safe_bm = r100_reg_safe_bm; | 1850 | rdev->config.r100.reg_safe_bm = r100_reg_safe_bm; |
| 2000 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r100_reg_safe_bm); | 1851 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r100_reg_safe_bm); |
| 2001 | } else { | 1852 | } else { |
| 2002 | return r200_init(rdev); | 1853 | r200_set_safe_registers(rdev); |
| 2003 | } | 1854 | } |
| 2004 | return 0; | ||
| 2005 | } | 1855 | } |
| 2006 | 1856 | ||
| 2007 | /* | 1857 | /* |
| @@ -2299,9 +2149,11 @@ void r100_bandwidth_update(struct radeon_device *rdev) | |||
| 2299 | mode1 = &rdev->mode_info.crtcs[0]->base.mode; | 2149 | mode1 = &rdev->mode_info.crtcs[0]->base.mode; |
| 2300 | pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8; | 2150 | pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8; |
| 2301 | } | 2151 | } |
| 2302 | if (rdev->mode_info.crtcs[1]->base.enabled) { | 2152 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { |
| 2303 | mode2 = &rdev->mode_info.crtcs[1]->base.mode; | 2153 | if (rdev->mode_info.crtcs[1]->base.enabled) { |
| 2304 | pixel_bytes2 = rdev->mode_info.crtcs[1]->base.fb->bits_per_pixel / 8; | 2154 | mode2 = &rdev->mode_info.crtcs[1]->base.mode; |
| 2155 | pixel_bytes2 = rdev->mode_info.crtcs[1]->base.fb->bits_per_pixel / 8; | ||
| 2156 | } | ||
| 2305 | } | 2157 | } |
| 2306 | 2158 | ||
| 2307 | min_mem_eff.full = rfixed_const_8(0); | 2159 | min_mem_eff.full = rfixed_const_8(0); |
| @@ -3114,7 +2966,7 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save) | |||
| 3114 | WREG32(R_000740_CP_CSQ_CNTL, 0); | 2966 | WREG32(R_000740_CP_CSQ_CNTL, 0); |
| 3115 | 2967 | ||
| 3116 | /* Save few CRTC registers */ | 2968 | /* Save few CRTC registers */ |
| 3117 | save->GENMO_WT = RREG32(R_0003C0_GENMO_WT); | 2969 | save->GENMO_WT = RREG8(R_0003C2_GENMO_WT); |
| 3118 | save->CRTC_EXT_CNTL = RREG32(R_000054_CRTC_EXT_CNTL); | 2970 | save->CRTC_EXT_CNTL = RREG32(R_000054_CRTC_EXT_CNTL); |
| 3119 | save->CRTC_GEN_CNTL = RREG32(R_000050_CRTC_GEN_CNTL); | 2971 | save->CRTC_GEN_CNTL = RREG32(R_000050_CRTC_GEN_CNTL); |
| 3120 | save->CUR_OFFSET = RREG32(R_000260_CUR_OFFSET); | 2972 | save->CUR_OFFSET = RREG32(R_000260_CUR_OFFSET); |
| @@ -3124,7 +2976,7 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save) | |||
| 3124 | } | 2976 | } |
| 3125 | 2977 | ||
| 3126 | /* Disable VGA aperture access */ | 2978 | /* Disable VGA aperture access */ |
| 3127 | WREG32(R_0003C0_GENMO_WT, C_0003C0_VGA_RAM_EN & save->GENMO_WT); | 2979 | WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & save->GENMO_WT); |
| 3128 | /* Disable cursor, overlay, crtc */ | 2980 | /* Disable cursor, overlay, crtc */ |
| 3129 | WREG32(R_000260_CUR_OFFSET, save->CUR_OFFSET | S_000260_CUR_LOCK(1)); | 2981 | WREG32(R_000260_CUR_OFFSET, save->CUR_OFFSET | S_000260_CUR_LOCK(1)); |
| 3130 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL | | 2982 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL | |
| @@ -3156,10 +3008,264 @@ void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save) | |||
| 3156 | rdev->mc.vram_location); | 3008 | rdev->mc.vram_location); |
| 3157 | } | 3009 | } |
| 3158 | /* Restore CRTC registers */ | 3010 | /* Restore CRTC registers */ |
| 3159 | WREG32(R_0003C0_GENMO_WT, save->GENMO_WT); | 3011 | WREG8(R_0003C2_GENMO_WT, save->GENMO_WT); |
| 3160 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL); | 3012 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL); |
| 3161 | WREG32(R_000050_CRTC_GEN_CNTL, save->CRTC_GEN_CNTL); | 3013 | WREG32(R_000050_CRTC_GEN_CNTL, save->CRTC_GEN_CNTL); |
| 3162 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { | 3014 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { |
| 3163 | WREG32(R_0003F8_CRTC2_GEN_CNTL, save->CRTC2_GEN_CNTL); | 3015 | WREG32(R_0003F8_CRTC2_GEN_CNTL, save->CRTC2_GEN_CNTL); |
| 3164 | } | 3016 | } |
| 3165 | } | 3017 | } |
| 3018 | |||
| 3019 | void r100_vga_render_disable(struct radeon_device *rdev) | ||
| 3020 | { | ||
| 3021 | u32 tmp; | ||
| 3022 | |||
| 3023 | tmp = RREG8(R_0003C2_GENMO_WT); | ||
| 3024 | WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & tmp); | ||
| 3025 | } | ||
| 3026 | |||
| 3027 | static void r100_debugfs(struct radeon_device *rdev) | ||
| 3028 | { | ||
| 3029 | int r; | ||
| 3030 | |||
| 3031 | r = r100_debugfs_mc_info_init(rdev); | ||
| 3032 | if (r) | ||
| 3033 | dev_warn(rdev->dev, "Failed to create r100_mc debugfs file.\n"); | ||
| 3034 | } | ||
| 3035 | |||
| 3036 | static void r100_mc_program(struct radeon_device *rdev) | ||
| 3037 | { | ||
| 3038 | struct r100_mc_save save; | ||
| 3039 | |||
| 3040 | /* Stops all mc clients */ | ||
| 3041 | r100_mc_stop(rdev, &save); | ||
| 3042 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 3043 | WREG32(R_00014C_MC_AGP_LOCATION, | ||
| 3044 | S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) | | ||
| 3045 | S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); | ||
| 3046 | WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); | ||
| 3047 | if (rdev->family > CHIP_RV200) | ||
| 3048 | WREG32(R_00015C_AGP_BASE_2, | ||
| 3049 | upper_32_bits(rdev->mc.agp_base) & 0xff); | ||
| 3050 | } else { | ||
| 3051 | WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
| 3052 | WREG32(R_000170_AGP_BASE, 0); | ||
| 3053 | if (rdev->family > CHIP_RV200) | ||
| 3054 | WREG32(R_00015C_AGP_BASE_2, 0); | ||
| 3055 | } | ||
| 3056 | /* Wait for mc idle */ | ||
| 3057 | if (r100_mc_wait_for_idle(rdev)) | ||
| 3058 | dev_warn(rdev->dev, "Wait for MC idle timeout.\n"); | ||
| 3059 | /* Program MC, should be a 32bits limited address space */ | ||
| 3060 | WREG32(R_000148_MC_FB_LOCATION, | ||
| 3061 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
| 3062 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
| 3063 | r100_mc_resume(rdev, &save); | ||
| 3064 | } | ||
| 3065 | |||
| 3066 | void r100_clock_startup(struct radeon_device *rdev) | ||
| 3067 | { | ||
| 3068 | u32 tmp; | ||
| 3069 | |||
| 3070 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
| 3071 | radeon_legacy_set_clock_gating(rdev, 1); | ||
| 3072 | /* We need to force on some of the block */ | ||
| 3073 | tmp = RREG32_PLL(R_00000D_SCLK_CNTL); | ||
| 3074 | tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); | ||
| 3075 | if ((rdev->family == CHIP_RV250) || (rdev->family == CHIP_RV280)) | ||
| 3076 | tmp |= S_00000D_FORCE_DISP1(1) | S_00000D_FORCE_DISP2(1); | ||
| 3077 | WREG32_PLL(R_00000D_SCLK_CNTL, tmp); | ||
| 3078 | } | ||
| 3079 | |||
| 3080 | static int r100_startup(struct radeon_device *rdev) | ||
| 3081 | { | ||
| 3082 | int r; | ||
| 3083 | |||
| 3084 | r100_mc_program(rdev); | ||
| 3085 | /* Resume clock */ | ||
| 3086 | r100_clock_startup(rdev); | ||
| 3087 | /* Initialize GPU configuration (# pipes, ...) */ | ||
| 3088 | r100_gpu_init(rdev); | ||
| 3089 | /* Initialize GART (initialize after TTM so we can allocate | ||
| 3090 | * memory through TTM but finalize after TTM) */ | ||
| 3091 | if (rdev->flags & RADEON_IS_PCI) { | ||
| 3092 | r = r100_pci_gart_enable(rdev); | ||
| 3093 | if (r) | ||
| 3094 | return r; | ||
| 3095 | } | ||
| 3096 | /* Enable IRQ */ | ||
| 3097 | rdev->irq.sw_int = true; | ||
| 3098 | r100_irq_set(rdev); | ||
| 3099 | /* 1M ring buffer */ | ||
| 3100 | r = r100_cp_init(rdev, 1024 * 1024); | ||
| 3101 | if (r) { | ||
| 3102 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
| 3103 | return r; | ||
| 3104 | } | ||
| 3105 | r = r100_wb_init(rdev); | ||
| 3106 | if (r) | ||
| 3107 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
| 3108 | r = r100_ib_init(rdev); | ||
| 3109 | if (r) { | ||
| 3110 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
| 3111 | return r; | ||
| 3112 | } | ||
| 3113 | return 0; | ||
| 3114 | } | ||
| 3115 | |||
| 3116 | int r100_resume(struct radeon_device *rdev) | ||
| 3117 | { | ||
| 3118 | /* Make sur GART are not working */ | ||
| 3119 | if (rdev->flags & RADEON_IS_PCI) | ||
| 3120 | r100_pci_gart_disable(rdev); | ||
| 3121 | /* Resume clock before doing reset */ | ||
| 3122 | r100_clock_startup(rdev); | ||
| 3123 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 3124 | if (radeon_gpu_reset(rdev)) { | ||
| 3125 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 3126 | RREG32(R_000E40_RBBM_STATUS), | ||
| 3127 | RREG32(R_0007C0_CP_STAT)); | ||
| 3128 | } | ||
| 3129 | /* post */ | ||
| 3130 | radeon_combios_asic_init(rdev->ddev); | ||
| 3131 | /* Resume clock after posting */ | ||
| 3132 | r100_clock_startup(rdev); | ||
| 3133 | return r100_startup(rdev); | ||
| 3134 | } | ||
| 3135 | |||
| 3136 | int r100_suspend(struct radeon_device *rdev) | ||
| 3137 | { | ||
| 3138 | r100_cp_disable(rdev); | ||
| 3139 | r100_wb_disable(rdev); | ||
| 3140 | r100_irq_disable(rdev); | ||
| 3141 | if (rdev->flags & RADEON_IS_PCI) | ||
| 3142 | r100_pci_gart_disable(rdev); | ||
| 3143 | return 0; | ||
| 3144 | } | ||
| 3145 | |||
| 3146 | void r100_fini(struct radeon_device *rdev) | ||
| 3147 | { | ||
| 3148 | r100_suspend(rdev); | ||
| 3149 | r100_cp_fini(rdev); | ||
| 3150 | r100_wb_fini(rdev); | ||
| 3151 | r100_ib_fini(rdev); | ||
| 3152 | radeon_gem_fini(rdev); | ||
| 3153 | if (rdev->flags & RADEON_IS_PCI) | ||
| 3154 | r100_pci_gart_fini(rdev); | ||
| 3155 | radeon_irq_kms_fini(rdev); | ||
| 3156 | radeon_fence_driver_fini(rdev); | ||
| 3157 | radeon_object_fini(rdev); | ||
| 3158 | radeon_atombios_fini(rdev); | ||
| 3159 | kfree(rdev->bios); | ||
| 3160 | rdev->bios = NULL; | ||
| 3161 | } | ||
| 3162 | |||
| 3163 | int r100_mc_init(struct radeon_device *rdev) | ||
| 3164 | { | ||
| 3165 | int r; | ||
| 3166 | u32 tmp; | ||
| 3167 | |||
| 3168 | /* Setup GPU memory space */ | ||
| 3169 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
| 3170 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
| 3171 | if (rdev->flags & RADEON_IS_IGP) { | ||
| 3172 | tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM)); | ||
| 3173 | rdev->mc.vram_location = tmp << 16; | ||
| 3174 | } | ||
| 3175 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 3176 | r = radeon_agp_init(rdev); | ||
| 3177 | if (r) { | ||
| 3178 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
| 3179 | rdev->flags &= ~RADEON_IS_AGP; | ||
| 3180 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
| 3181 | } else { | ||
| 3182 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
| 3183 | } | ||
| 3184 | } | ||
| 3185 | r = radeon_mc_setup(rdev); | ||
| 3186 | if (r) | ||
| 3187 | return r; | ||
| 3188 | return 0; | ||
| 3189 | } | ||
| 3190 | |||
| 3191 | int r100_init(struct radeon_device *rdev) | ||
| 3192 | { | ||
| 3193 | int r; | ||
| 3194 | |||
| 3195 | /* Register debugfs file specific to this group of asics */ | ||
| 3196 | r100_debugfs(rdev); | ||
| 3197 | /* Disable VGA */ | ||
| 3198 | r100_vga_render_disable(rdev); | ||
| 3199 | /* Initialize scratch registers */ | ||
| 3200 | radeon_scratch_init(rdev); | ||
| 3201 | /* Initialize surface registers */ | ||
| 3202 | radeon_surface_init(rdev); | ||
| 3203 | /* TODO: disable VGA need to use VGA request */ | ||
| 3204 | /* BIOS*/ | ||
| 3205 | if (!radeon_get_bios(rdev)) { | ||
| 3206 | if (ASIC_IS_AVIVO(rdev)) | ||
| 3207 | return -EINVAL; | ||
| 3208 | } | ||
| 3209 | if (rdev->is_atom_bios) { | ||
| 3210 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); | ||
| 3211 | return -EINVAL; | ||
| 3212 | } else { | ||
| 3213 | r = radeon_combios_init(rdev); | ||
| 3214 | if (r) | ||
| 3215 | return r; | ||
| 3216 | } | ||
| 3217 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 3218 | if (radeon_gpu_reset(rdev)) { | ||
| 3219 | dev_warn(rdev->dev, | ||
| 3220 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 3221 | RREG32(R_000E40_RBBM_STATUS), | ||
| 3222 | RREG32(R_0007C0_CP_STAT)); | ||
| 3223 | } | ||
| 3224 | /* check if cards are posted or not */ | ||
| 3225 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
| 3226 | DRM_INFO("GPU not posted. posting now...\n"); | ||
| 3227 | radeon_combios_asic_init(rdev->ddev); | ||
| 3228 | } | ||
| 3229 | /* Set asic errata */ | ||
| 3230 | r100_errata(rdev); | ||
| 3231 | /* Initialize clocks */ | ||
| 3232 | radeon_get_clock_info(rdev->ddev); | ||
| 3233 | /* Get vram informations */ | ||
| 3234 | r100_vram_info(rdev); | ||
| 3235 | /* Initialize memory controller (also test AGP) */ | ||
| 3236 | r = r100_mc_init(rdev); | ||
| 3237 | if (r) | ||
| 3238 | return r; | ||
| 3239 | /* Fence driver */ | ||
| 3240 | r = radeon_fence_driver_init(rdev); | ||
| 3241 | if (r) | ||
| 3242 | return r; | ||
| 3243 | r = radeon_irq_kms_init(rdev); | ||
| 3244 | if (r) | ||
| 3245 | return r; | ||
| 3246 | /* Memory manager */ | ||
| 3247 | r = radeon_object_init(rdev); | ||
| 3248 | if (r) | ||
| 3249 | return r; | ||
| 3250 | if (rdev->flags & RADEON_IS_PCI) { | ||
| 3251 | r = r100_pci_gart_init(rdev); | ||
| 3252 | if (r) | ||
| 3253 | return r; | ||
| 3254 | } | ||
| 3255 | r100_set_safe_registers(rdev); | ||
| 3256 | rdev->accel_working = true; | ||
| 3257 | r = r100_startup(rdev); | ||
| 3258 | if (r) { | ||
| 3259 | /* Somethings want wront with the accel init stop accel */ | ||
| 3260 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
| 3261 | r100_suspend(rdev); | ||
| 3262 | r100_cp_fini(rdev); | ||
| 3263 | r100_wb_fini(rdev); | ||
| 3264 | r100_ib_fini(rdev); | ||
| 3265 | if (rdev->flags & RADEON_IS_PCI) | ||
| 3266 | r100_pci_gart_fini(rdev); | ||
| 3267 | radeon_irq_kms_fini(rdev); | ||
| 3268 | rdev->accel_working = false; | ||
| 3269 | } | ||
| 3270 | return 0; | ||
| 3271 | } | ||
diff --git a/drivers/gpu/drm/radeon/r100d.h b/drivers/gpu/drm/radeon/r100d.h index c4b257ec920e..df29a630c466 100644 --- a/drivers/gpu/drm/radeon/r100d.h +++ b/drivers/gpu/drm/radeon/r100d.h | |||
| @@ -381,6 +381,24 @@ | |||
| 381 | #define S_000054_VCRTC_IDX_MASTER(x) (((x) & 0x7F) << 24) | 381 | #define S_000054_VCRTC_IDX_MASTER(x) (((x) & 0x7F) << 24) |
| 382 | #define G_000054_VCRTC_IDX_MASTER(x) (((x) >> 24) & 0x7F) | 382 | #define G_000054_VCRTC_IDX_MASTER(x) (((x) >> 24) & 0x7F) |
| 383 | #define C_000054_VCRTC_IDX_MASTER 0x80FFFFFF | 383 | #define C_000054_VCRTC_IDX_MASTER 0x80FFFFFF |
| 384 | #define R_000148_MC_FB_LOCATION 0x000148 | ||
| 385 | #define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 386 | #define G_000148_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 387 | #define C_000148_MC_FB_START 0xFFFF0000 | ||
| 388 | #define S_000148_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 389 | #define G_000148_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 390 | #define C_000148_MC_FB_TOP 0x0000FFFF | ||
| 391 | #define R_00014C_MC_AGP_LOCATION 0x00014C | ||
| 392 | #define S_00014C_MC_AGP_START(x) (((x) & 0xFFFF) << 0) | ||
| 393 | #define G_00014C_MC_AGP_START(x) (((x) >> 0) & 0xFFFF) | ||
| 394 | #define C_00014C_MC_AGP_START 0xFFFF0000 | ||
| 395 | #define S_00014C_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 396 | #define G_00014C_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 397 | #define C_00014C_MC_AGP_TOP 0x0000FFFF | ||
| 398 | #define R_000170_AGP_BASE 0x000170 | ||
| 399 | #define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | ||
| 400 | #define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | ||
| 401 | #define C_000170_AGP_BASE_ADDR 0x00000000 | ||
| 384 | #define R_00023C_DISPLAY_BASE_ADDR 0x00023C | 402 | #define R_00023C_DISPLAY_BASE_ADDR 0x00023C |
| 385 | #define S_00023C_DISPLAY_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | 403 | #define S_00023C_DISPLAY_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) |
| 386 | #define G_00023C_DISPLAY_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | 404 | #define G_00023C_DISPLAY_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) |
| @@ -403,25 +421,25 @@ | |||
| 403 | #define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31) | 421 | #define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31) |
| 404 | #define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1) | 422 | #define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1) |
| 405 | #define C_000360_CUR2_LOCK 0x7FFFFFFF | 423 | #define C_000360_CUR2_LOCK 0x7FFFFFFF |
| 406 | #define R_0003C0_GENMO_WT 0x0003C0 | 424 | #define R_0003C2_GENMO_WT 0x0003C0 |
| 407 | #define S_0003C0_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0) | 425 | #define S_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0) |
| 408 | #define G_0003C0_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1) | 426 | #define G_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1) |
| 409 | #define C_0003C0_GENMO_MONO_ADDRESS_B 0xFFFFFFFE | 427 | #define C_0003C2_GENMO_MONO_ADDRESS_B 0xFE |
| 410 | #define S_0003C0_VGA_RAM_EN(x) (((x) & 0x1) << 1) | 428 | #define S_0003C2_VGA_RAM_EN(x) (((x) & 0x1) << 1) |
| 411 | #define G_0003C0_VGA_RAM_EN(x) (((x) >> 1) & 0x1) | 429 | #define G_0003C2_VGA_RAM_EN(x) (((x) >> 1) & 0x1) |
| 412 | #define C_0003C0_VGA_RAM_EN 0xFFFFFFFD | 430 | #define C_0003C2_VGA_RAM_EN 0xFD |
| 413 | #define S_0003C0_VGA_CKSEL(x) (((x) & 0x3) << 2) | 431 | #define S_0003C2_VGA_CKSEL(x) (((x) & 0x3) << 2) |
| 414 | #define G_0003C0_VGA_CKSEL(x) (((x) >> 2) & 0x3) | 432 | #define G_0003C2_VGA_CKSEL(x) (((x) >> 2) & 0x3) |
| 415 | #define C_0003C0_VGA_CKSEL 0xFFFFFFF3 | 433 | #define C_0003C2_VGA_CKSEL 0xF3 |
| 416 | #define S_0003C0_ODD_EVEN_MD_PGSEL(x) (((x) & 0x1) << 5) | 434 | #define S_0003C2_ODD_EVEN_MD_PGSEL(x) (((x) & 0x1) << 5) |
| 417 | #define G_0003C0_ODD_EVEN_MD_PGSEL(x) (((x) >> 5) & 0x1) | 435 | #define G_0003C2_ODD_EVEN_MD_PGSEL(x) (((x) >> 5) & 0x1) |
| 418 | #define C_0003C0_ODD_EVEN_MD_PGSEL 0xFFFFFFDF | 436 | #define C_0003C2_ODD_EVEN_MD_PGSEL 0xDF |
| 419 | #define S_0003C0_VGA_HSYNC_POL(x) (((x) & 0x1) << 6) | 437 | #define S_0003C2_VGA_HSYNC_POL(x) (((x) & 0x1) << 6) |
| 420 | #define G_0003C0_VGA_HSYNC_POL(x) (((x) >> 6) & 0x1) | 438 | #define G_0003C2_VGA_HSYNC_POL(x) (((x) >> 6) & 0x1) |
| 421 | #define C_0003C0_VGA_HSYNC_POL 0xFFFFFFBF | 439 | #define C_0003C2_VGA_HSYNC_POL 0xBF |
| 422 | #define S_0003C0_VGA_VSYNC_POL(x) (((x) & 0x1) << 7) | 440 | #define S_0003C2_VGA_VSYNC_POL(x) (((x) & 0x1) << 7) |
| 423 | #define G_0003C0_VGA_VSYNC_POL(x) (((x) >> 7) & 0x1) | 441 | #define G_0003C2_VGA_VSYNC_POL(x) (((x) >> 7) & 0x1) |
| 424 | #define C_0003C0_VGA_VSYNC_POL 0xFFFFFF7F | 442 | #define C_0003C2_VGA_VSYNC_POL 0x7F |
| 425 | #define R_0003F8_CRTC2_GEN_CNTL 0x0003F8 | 443 | #define R_0003F8_CRTC2_GEN_CNTL 0x0003F8 |
| 426 | #define S_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) & 0x1) << 0) | 444 | #define S_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) & 0x1) << 0) |
| 427 | #define G_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) >> 0) & 0x1) | 445 | #define G_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) >> 0) & 0x1) |
| @@ -545,6 +563,46 @@ | |||
| 545 | #define S_000774_SCRATCH_ADDR(x) (((x) & 0x7FFFFFF) << 5) | 563 | #define S_000774_SCRATCH_ADDR(x) (((x) & 0x7FFFFFF) << 5) |
| 546 | #define G_000774_SCRATCH_ADDR(x) (((x) >> 5) & 0x7FFFFFF) | 564 | #define G_000774_SCRATCH_ADDR(x) (((x) >> 5) & 0x7FFFFFF) |
| 547 | #define C_000774_SCRATCH_ADDR 0x0000001F | 565 | #define C_000774_SCRATCH_ADDR 0x0000001F |
| 566 | #define R_0007C0_CP_STAT 0x0007C0 | ||
| 567 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
| 568 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
| 569 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
| 570 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
| 571 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
| 572 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
| 573 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
| 574 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
| 575 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
| 576 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
| 577 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
| 578 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
| 579 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
| 580 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
| 581 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
| 582 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
| 583 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
| 584 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
| 585 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
| 586 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
| 587 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
| 588 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
| 589 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
| 590 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
| 591 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
| 592 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
| 593 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
| 594 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
| 595 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
| 596 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
| 597 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
| 598 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
| 599 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
| 600 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
| 601 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
| 602 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
| 603 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
| 604 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
| 605 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
| 548 | #define R_000E40_RBBM_STATUS 0x000E40 | 606 | #define R_000E40_RBBM_STATUS 0x000E40 |
| 549 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | 607 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) |
| 550 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | 608 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) |
| @@ -604,4 +662,53 @@ | |||
| 604 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | 662 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) |
| 605 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | 663 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF |
| 606 | 664 | ||
| 665 | |||
| 666 | #define R_00000D_SCLK_CNTL 0x00000D | ||
| 667 | #define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0) | ||
| 668 | #define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7) | ||
| 669 | #define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8 | ||
| 670 | #define S_00000D_TCLK_SRC_SEL(x) (((x) & 0x7) << 8) | ||
| 671 | #define G_00000D_TCLK_SRC_SEL(x) (((x) >> 8) & 0x7) | ||
| 672 | #define C_00000D_TCLK_SRC_SEL 0xFFFFF8FF | ||
| 673 | #define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16) | ||
| 674 | #define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1) | ||
| 675 | #define C_00000D_FORCE_CP 0xFFFEFFFF | ||
| 676 | #define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17) | ||
| 677 | #define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1) | ||
| 678 | #define C_00000D_FORCE_HDP 0xFFFDFFFF | ||
| 679 | #define S_00000D_FORCE_DISP(x) (((x) & 0x1) << 18) | ||
| 680 | #define G_00000D_FORCE_DISP(x) (((x) >> 18) & 0x1) | ||
| 681 | #define C_00000D_FORCE_DISP 0xFFFBFFFF | ||
| 682 | #define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19) | ||
| 683 | #define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1) | ||
| 684 | #define C_00000D_FORCE_TOP 0xFFF7FFFF | ||
| 685 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | ||
| 686 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | ||
| 687 | #define C_00000D_FORCE_E2 0xFFEFFFFF | ||
| 688 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | ||
| 689 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | ||
| 690 | #define C_00000D_FORCE_SE 0xFFDFFFFF | ||
| 691 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | ||
| 692 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | ||
| 693 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | ||
| 694 | #define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23) | ||
| 695 | #define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1) | ||
| 696 | #define C_00000D_FORCE_VIP 0xFF7FFFFF | ||
| 697 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | ||
| 698 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | ||
| 699 | #define C_00000D_FORCE_RE 0xFEFFFFFF | ||
| 700 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | ||
| 701 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | ||
| 702 | #define C_00000D_FORCE_PB 0xFDFFFFFF | ||
| 703 | #define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26) | ||
| 704 | #define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1) | ||
| 705 | #define C_00000D_FORCE_TAM 0xFBFFFFFF | ||
| 706 | #define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27) | ||
| 707 | #define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1) | ||
| 708 | #define C_00000D_FORCE_TDM 0xF7FFFFFF | ||
| 709 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | ||
| 710 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | ||
| 711 | #define C_00000D_FORCE_RB 0xEFFFFFFF | ||
| 712 | |||
| 713 | |||
| 607 | #endif | 714 | #endif |
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c index cf7fea5ff2e5..eb740fc3549f 100644 --- a/drivers/gpu/drm/radeon/r200.c +++ b/drivers/gpu/drm/radeon/r200.c | |||
| @@ -447,9 +447,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 447 | return 0; | 447 | return 0; |
| 448 | } | 448 | } |
| 449 | 449 | ||
| 450 | int r200_init(struct radeon_device *rdev) | 450 | void r200_set_safe_registers(struct radeon_device *rdev) |
| 451 | { | 451 | { |
| 452 | rdev->config.r100.reg_safe_bm = r200_reg_safe_bm; | 452 | rdev->config.r100.reg_safe_bm = r200_reg_safe_bm; |
| 453 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r200_reg_safe_bm); | 453 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r200_reg_safe_bm); |
| 454 | return 0; | ||
| 455 | } | 454 | } |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 1ebea8cc8c93..e08c4a8974ca 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -33,43 +33,16 @@ | |||
| 33 | #include "radeon_drm.h" | 33 | #include "radeon_drm.h" |
| 34 | #include "r100_track.h" | 34 | #include "r100_track.h" |
| 35 | #include "r300d.h" | 35 | #include "r300d.h" |
| 36 | 36 | #include "rv350d.h" | |
| 37 | #include "r300_reg_safe.h" | 37 | #include "r300_reg_safe.h" |
| 38 | 38 | ||
| 39 | /* r300,r350,rv350,rv370,rv380 depends on : */ | 39 | /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */ |
| 40 | void r100_hdp_reset(struct radeon_device *rdev); | ||
| 41 | int r100_cp_reset(struct radeon_device *rdev); | ||
| 42 | int r100_rb2d_reset(struct radeon_device *rdev); | ||
| 43 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | ||
| 44 | int r100_pci_gart_enable(struct radeon_device *rdev); | ||
| 45 | void r100_mc_setup(struct radeon_device *rdev); | ||
| 46 | void r100_mc_disable_clients(struct radeon_device *rdev); | ||
| 47 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
| 48 | int r100_cs_packet_parse(struct radeon_cs_parser *p, | ||
| 49 | struct radeon_cs_packet *pkt, | ||
| 50 | unsigned idx); | ||
| 51 | int r100_cs_packet_parse_vline(struct radeon_cs_parser *p); | ||
| 52 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, | ||
| 53 | struct radeon_cs_packet *pkt, | ||
| 54 | const unsigned *auth, unsigned n, | ||
| 55 | radeon_packet0_check_t check); | ||
| 56 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
| 57 | struct radeon_cs_packet *pkt, | ||
| 58 | struct radeon_object *robj); | ||
| 59 | |||
| 60 | /* This files gather functions specifics to: | ||
| 61 | * r300,r350,rv350,rv370,rv380 | ||
| 62 | * | ||
| 63 | * Some of these functions might be used by newer ASICs. | ||
| 64 | */ | ||
| 65 | void r300_gpu_init(struct radeon_device *rdev); | ||
| 66 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 67 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev); | ||
| 68 | |||
| 69 | 40 | ||
| 70 | /* | 41 | /* |
| 71 | * rv370,rv380 PCIE GART | 42 | * rv370,rv380 PCIE GART |
| 72 | */ | 43 | */ |
| 44 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev); | ||
| 45 | |||
| 73 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | 46 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) |
| 74 | { | 47 | { |
| 75 | uint32_t tmp; | 48 | uint32_t tmp; |
| @@ -182,59 +155,6 @@ void rv370_pcie_gart_fini(struct radeon_device *rdev) | |||
| 182 | radeon_gart_fini(rdev); | 155 | radeon_gart_fini(rdev); |
| 183 | } | 156 | } |
| 184 | 157 | ||
| 185 | /* | ||
| 186 | * MC | ||
| 187 | */ | ||
| 188 | int r300_mc_init(struct radeon_device *rdev) | ||
| 189 | { | ||
| 190 | int r; | ||
| 191 | |||
| 192 | if (r100_debugfs_rbbm_init(rdev)) { | ||
| 193 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
| 194 | } | ||
| 195 | |||
| 196 | r300_gpu_init(rdev); | ||
| 197 | r100_pci_gart_disable(rdev); | ||
| 198 | if (rdev->flags & RADEON_IS_PCIE) { | ||
| 199 | rv370_pcie_gart_disable(rdev); | ||
| 200 | } | ||
| 201 | |||
| 202 | /* Setup GPU memory space */ | ||
| 203 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
| 204 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
| 205 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 206 | r = radeon_agp_init(rdev); | ||
| 207 | if (r) { | ||
| 208 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
| 209 | rdev->flags &= ~RADEON_IS_AGP; | ||
| 210 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
| 211 | } else { | ||
| 212 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
| 213 | } | ||
| 214 | } | ||
| 215 | r = radeon_mc_setup(rdev); | ||
| 216 | if (r) { | ||
| 217 | return r; | ||
| 218 | } | ||
| 219 | |||
| 220 | /* Program GPU memory space */ | ||
| 221 | r100_mc_disable_clients(rdev); | ||
| 222 | if (r300_mc_wait_for_idle(rdev)) { | ||
| 223 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
| 224 | "programming pipes. Bad things might happen.\n"); | ||
| 225 | } | ||
| 226 | r100_mc_setup(rdev); | ||
| 227 | return 0; | ||
| 228 | } | ||
| 229 | |||
| 230 | void r300_mc_fini(struct radeon_device *rdev) | ||
| 231 | { | ||
| 232 | } | ||
| 233 | |||
| 234 | |||
| 235 | /* | ||
| 236 | * Fence emission | ||
| 237 | */ | ||
| 238 | void r300_fence_ring_emit(struct radeon_device *rdev, | 158 | void r300_fence_ring_emit(struct radeon_device *rdev, |
| 239 | struct radeon_fence *fence) | 159 | struct radeon_fence *fence) |
| 240 | { | 160 | { |
| @@ -260,10 +180,6 @@ void r300_fence_ring_emit(struct radeon_device *rdev, | |||
| 260 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); | 180 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
| 261 | } | 181 | } |
| 262 | 182 | ||
| 263 | |||
| 264 | /* | ||
| 265 | * Global GPU functions | ||
| 266 | */ | ||
| 267 | int r300_copy_dma(struct radeon_device *rdev, | 183 | int r300_copy_dma(struct radeon_device *rdev, |
| 268 | uint64_t src_offset, | 184 | uint64_t src_offset, |
| 269 | uint64_t dst_offset, | 185 | uint64_t dst_offset, |
| @@ -582,11 +498,6 @@ void r300_vram_info(struct radeon_device *rdev) | |||
| 582 | r100_vram_init_sizes(rdev); | 498 | r100_vram_init_sizes(rdev); |
| 583 | } | 499 | } |
| 584 | 500 | ||
| 585 | |||
| 586 | /* | ||
| 587 | * PCIE Lanes | ||
| 588 | */ | ||
| 589 | |||
| 590 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) | 501 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) |
| 591 | { | 502 | { |
| 592 | uint32_t link_width_cntl, mask; | 503 | uint32_t link_width_cntl, mask; |
| @@ -646,10 +557,6 @@ void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) | |||
| 646 | 557 | ||
| 647 | } | 558 | } |
| 648 | 559 | ||
| 649 | |||
| 650 | /* | ||
| 651 | * Debugfs info | ||
| 652 | */ | ||
| 653 | #if defined(CONFIG_DEBUG_FS) | 560 | #if defined(CONFIG_DEBUG_FS) |
| 654 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) | 561 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) |
| 655 | { | 562 | { |
| @@ -680,7 +587,7 @@ static struct drm_info_list rv370_pcie_gart_info_list[] = { | |||
| 680 | }; | 587 | }; |
| 681 | #endif | 588 | #endif |
| 682 | 589 | ||
| 683 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | 590 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
| 684 | { | 591 | { |
| 685 | #if defined(CONFIG_DEBUG_FS) | 592 | #if defined(CONFIG_DEBUG_FS) |
| 686 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); | 593 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); |
| @@ -689,10 +596,6 @@ int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | |||
| 689 | #endif | 596 | #endif |
| 690 | } | 597 | } |
| 691 | 598 | ||
| 692 | |||
| 693 | /* | ||
| 694 | * CS functions | ||
| 695 | */ | ||
| 696 | static int r300_packet0_check(struct radeon_cs_parser *p, | 599 | static int r300_packet0_check(struct radeon_cs_parser *p, |
| 697 | struct radeon_cs_packet *pkt, | 600 | struct radeon_cs_packet *pkt, |
| 698 | unsigned idx, unsigned reg) | 601 | unsigned idx, unsigned reg) |
| @@ -1226,12 +1129,6 @@ void r300_set_reg_safe(struct radeon_device *rdev) | |||
| 1226 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); | 1129 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); |
| 1227 | } | 1130 | } |
| 1228 | 1131 | ||
| 1229 | int r300_init(struct radeon_device *rdev) | ||
| 1230 | { | ||
| 1231 | r300_set_reg_safe(rdev); | ||
| 1232 | return 0; | ||
| 1233 | } | ||
| 1234 | |||
| 1235 | void r300_mc_program(struct radeon_device *rdev) | 1132 | void r300_mc_program(struct radeon_device *rdev) |
| 1236 | { | 1133 | { |
| 1237 | struct r100_mc_save save; | 1134 | struct r100_mc_save save; |
| @@ -1265,3 +1162,198 @@ void r300_mc_program(struct radeon_device *rdev) | |||
| 1265 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 1162 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
| 1266 | r100_mc_resume(rdev, &save); | 1163 | r100_mc_resume(rdev, &save); |
| 1267 | } | 1164 | } |
| 1165 | |||
| 1166 | void r300_clock_startup(struct radeon_device *rdev) | ||
| 1167 | { | ||
| 1168 | u32 tmp; | ||
| 1169 | |||
| 1170 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
| 1171 | radeon_legacy_set_clock_gating(rdev, 1); | ||
| 1172 | /* We need to force on some of the block */ | ||
| 1173 | tmp = RREG32_PLL(R_00000D_SCLK_CNTL); | ||
| 1174 | tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); | ||
| 1175 | if ((rdev->family == CHIP_RV350) || (rdev->family == CHIP_RV380)) | ||
| 1176 | tmp |= S_00000D_FORCE_VAP(1); | ||
| 1177 | WREG32_PLL(R_00000D_SCLK_CNTL, tmp); | ||
| 1178 | } | ||
| 1179 | |||
| 1180 | static int r300_startup(struct radeon_device *rdev) | ||
| 1181 | { | ||
| 1182 | int r; | ||
| 1183 | |||
| 1184 | r300_mc_program(rdev); | ||
| 1185 | /* Resume clock */ | ||
| 1186 | r300_clock_startup(rdev); | ||
| 1187 | /* Initialize GPU configuration (# pipes, ...) */ | ||
| 1188 | r300_gpu_init(rdev); | ||
| 1189 | /* Initialize GART (initialize after TTM so we can allocate | ||
| 1190 | * memory through TTM but finalize after TTM) */ | ||
| 1191 | if (rdev->flags & RADEON_IS_PCIE) { | ||
| 1192 | r = rv370_pcie_gart_enable(rdev); | ||
| 1193 | if (r) | ||
| 1194 | return r; | ||
| 1195 | } | ||
| 1196 | if (rdev->flags & RADEON_IS_PCI) { | ||
| 1197 | r = r100_pci_gart_enable(rdev); | ||
| 1198 | if (r) | ||
| 1199 | return r; | ||
| 1200 | } | ||
| 1201 | /* Enable IRQ */ | ||
| 1202 | rdev->irq.sw_int = true; | ||
| 1203 | r100_irq_set(rdev); | ||
| 1204 | /* 1M ring buffer */ | ||
| 1205 | r = r100_cp_init(rdev, 1024 * 1024); | ||
| 1206 | if (r) { | ||
| 1207 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
| 1208 | return r; | ||
| 1209 | } | ||
| 1210 | r = r100_wb_init(rdev); | ||
| 1211 | if (r) | ||
| 1212 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
| 1213 | r = r100_ib_init(rdev); | ||
| 1214 | if (r) { | ||
| 1215 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
| 1216 | return r; | ||
| 1217 | } | ||
| 1218 | return 0; | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | int r300_resume(struct radeon_device *rdev) | ||
| 1222 | { | ||
| 1223 | /* Make sur GART are not working */ | ||
| 1224 | if (rdev->flags & RADEON_IS_PCIE) | ||
| 1225 | rv370_pcie_gart_disable(rdev); | ||
| 1226 | if (rdev->flags & RADEON_IS_PCI) | ||
| 1227 | r100_pci_gart_disable(rdev); | ||
| 1228 | /* Resume clock before doing reset */ | ||
| 1229 | r300_clock_startup(rdev); | ||
| 1230 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 1231 | if (radeon_gpu_reset(rdev)) { | ||
| 1232 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 1233 | RREG32(R_000E40_RBBM_STATUS), | ||
| 1234 | RREG32(R_0007C0_CP_STAT)); | ||
| 1235 | } | ||
| 1236 | /* post */ | ||
| 1237 | radeon_combios_asic_init(rdev->ddev); | ||
| 1238 | /* Resume clock after posting */ | ||
| 1239 | r300_clock_startup(rdev); | ||
| 1240 | return r300_startup(rdev); | ||
| 1241 | } | ||
| 1242 | |||
| 1243 | int r300_suspend(struct radeon_device *rdev) | ||
| 1244 | { | ||
| 1245 | r100_cp_disable(rdev); | ||
| 1246 | r100_wb_disable(rdev); | ||
| 1247 | r100_irq_disable(rdev); | ||
| 1248 | if (rdev->flags & RADEON_IS_PCIE) | ||
| 1249 | rv370_pcie_gart_disable(rdev); | ||
| 1250 | if (rdev->flags & RADEON_IS_PCI) | ||
| 1251 | r100_pci_gart_disable(rdev); | ||
| 1252 | return 0; | ||
| 1253 | } | ||
| 1254 | |||
| 1255 | void r300_fini(struct radeon_device *rdev) | ||
| 1256 | { | ||
| 1257 | r300_suspend(rdev); | ||
| 1258 | r100_cp_fini(rdev); | ||
| 1259 | r100_wb_fini(rdev); | ||
| 1260 | r100_ib_fini(rdev); | ||
| 1261 | radeon_gem_fini(rdev); | ||
| 1262 | if (rdev->flags & RADEON_IS_PCIE) | ||
| 1263 | rv370_pcie_gart_fini(rdev); | ||
| 1264 | if (rdev->flags & RADEON_IS_PCI) | ||
| 1265 | r100_pci_gart_fini(rdev); | ||
| 1266 | radeon_irq_kms_fini(rdev); | ||
| 1267 | radeon_fence_driver_fini(rdev); | ||
| 1268 | radeon_object_fini(rdev); | ||
| 1269 | radeon_atombios_fini(rdev); | ||
| 1270 | kfree(rdev->bios); | ||
| 1271 | rdev->bios = NULL; | ||
| 1272 | } | ||
| 1273 | |||
| 1274 | int r300_init(struct radeon_device *rdev) | ||
| 1275 | { | ||
| 1276 | int r; | ||
| 1277 | |||
| 1278 | /* Disable VGA */ | ||
| 1279 | r100_vga_render_disable(rdev); | ||
| 1280 | /* Initialize scratch registers */ | ||
| 1281 | radeon_scratch_init(rdev); | ||
| 1282 | /* Initialize surface registers */ | ||
| 1283 | radeon_surface_init(rdev); | ||
| 1284 | /* TODO: disable VGA need to use VGA request */ | ||
| 1285 | /* BIOS*/ | ||
| 1286 | if (!radeon_get_bios(rdev)) { | ||
| 1287 | if (ASIC_IS_AVIVO(rdev)) | ||
| 1288 | return -EINVAL; | ||
| 1289 | } | ||
| 1290 | if (rdev->is_atom_bios) { | ||
| 1291 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); | ||
| 1292 | return -EINVAL; | ||
| 1293 | } else { | ||
| 1294 | r = radeon_combios_init(rdev); | ||
| 1295 | if (r) | ||
| 1296 | return r; | ||
| 1297 | } | ||
| 1298 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 1299 | if (radeon_gpu_reset(rdev)) { | ||
| 1300 | dev_warn(rdev->dev, | ||
| 1301 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 1302 | RREG32(R_000E40_RBBM_STATUS), | ||
| 1303 | RREG32(R_0007C0_CP_STAT)); | ||
| 1304 | } | ||
| 1305 | /* check if cards are posted or not */ | ||
| 1306 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
| 1307 | DRM_INFO("GPU not posted. posting now...\n"); | ||
| 1308 | radeon_combios_asic_init(rdev->ddev); | ||
| 1309 | } | ||
| 1310 | /* Set asic errata */ | ||
| 1311 | r300_errata(rdev); | ||
| 1312 | /* Initialize clocks */ | ||
| 1313 | radeon_get_clock_info(rdev->ddev); | ||
| 1314 | /* Get vram informations */ | ||
| 1315 | r300_vram_info(rdev); | ||
| 1316 | /* Initialize memory controller (also test AGP) */ | ||
| 1317 | r = r420_mc_init(rdev); | ||
| 1318 | if (r) | ||
| 1319 | return r; | ||
| 1320 | /* Fence driver */ | ||
| 1321 | r = radeon_fence_driver_init(rdev); | ||
| 1322 | if (r) | ||
| 1323 | return r; | ||
| 1324 | r = radeon_irq_kms_init(rdev); | ||
| 1325 | if (r) | ||
| 1326 | return r; | ||
| 1327 | /* Memory manager */ | ||
| 1328 | r = radeon_object_init(rdev); | ||
| 1329 | if (r) | ||
| 1330 | return r; | ||
| 1331 | if (rdev->flags & RADEON_IS_PCIE) { | ||
| 1332 | r = rv370_pcie_gart_init(rdev); | ||
| 1333 | if (r) | ||
| 1334 | return r; | ||
| 1335 | } | ||
| 1336 | if (rdev->flags & RADEON_IS_PCI) { | ||
| 1337 | r = r100_pci_gart_init(rdev); | ||
| 1338 | if (r) | ||
| 1339 | return r; | ||
| 1340 | } | ||
| 1341 | r300_set_reg_safe(rdev); | ||
| 1342 | rdev->accel_working = true; | ||
| 1343 | r = r300_startup(rdev); | ||
| 1344 | if (r) { | ||
| 1345 | /* Somethings want wront with the accel init stop accel */ | ||
| 1346 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
| 1347 | r300_suspend(rdev); | ||
| 1348 | r100_cp_fini(rdev); | ||
| 1349 | r100_wb_fini(rdev); | ||
| 1350 | r100_ib_fini(rdev); | ||
| 1351 | if (rdev->flags & RADEON_IS_PCIE) | ||
| 1352 | rv370_pcie_gart_fini(rdev); | ||
| 1353 | if (rdev->flags & RADEON_IS_PCI) | ||
| 1354 | r100_pci_gart_fini(rdev); | ||
| 1355 | radeon_irq_kms_fini(rdev); | ||
| 1356 | rdev->accel_working = false; | ||
| 1357 | } | ||
| 1358 | return 0; | ||
| 1359 | } | ||
diff --git a/drivers/gpu/drm/radeon/r300d.h b/drivers/gpu/drm/radeon/r300d.h index d4fa3eb1074f..4c73114f0de9 100644 --- a/drivers/gpu/drm/radeon/r300d.h +++ b/drivers/gpu/drm/radeon/r300d.h | |||
| @@ -96,6 +96,211 @@ | |||
| 96 | #define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | 96 | #define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) |
| 97 | #define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | 97 | #define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) |
| 98 | #define C_000170_AGP_BASE_ADDR 0x00000000 | 98 | #define C_000170_AGP_BASE_ADDR 0x00000000 |
| 99 | #define R_0007C0_CP_STAT 0x0007C0 | ||
| 100 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
| 101 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
| 102 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
| 103 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
| 104 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
| 105 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
| 106 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
| 107 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
| 108 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
| 109 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
| 110 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
| 111 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
| 112 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
| 113 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
| 114 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
| 115 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
| 116 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
| 117 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
| 118 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
| 119 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
| 120 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
| 121 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
| 122 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
| 123 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
| 124 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
| 125 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
| 126 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
| 127 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
| 128 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
| 129 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
| 130 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
| 131 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
| 132 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
| 133 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
| 134 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
| 135 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
| 136 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
| 137 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
| 138 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
| 139 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
| 140 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
| 141 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
| 142 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
| 143 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
| 144 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
| 145 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
| 146 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
| 147 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
| 148 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
| 149 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
| 150 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
| 151 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
| 152 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
| 153 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
| 154 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
| 155 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
| 156 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
| 157 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
| 158 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
| 159 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
| 160 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
| 161 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
| 162 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
| 163 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
| 164 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
| 165 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
| 166 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
| 167 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
| 168 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
| 169 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
| 170 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
| 171 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
| 172 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
| 173 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
| 174 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
| 175 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
| 176 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
| 177 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
| 178 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
| 179 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
| 180 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
| 181 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
| 182 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
| 183 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
| 184 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
| 185 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
| 186 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
| 187 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
| 188 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
| 189 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
| 190 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
| 191 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
| 192 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
| 193 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
| 194 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
| 195 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
| 196 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
| 197 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
| 198 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
| 199 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
| 200 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
| 201 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
| 202 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
| 203 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
| 204 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
| 205 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
| 206 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
| 207 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
| 208 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
| 209 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
| 210 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
| 211 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
| 99 | 212 | ||
| 100 | 213 | ||
| 214 | #define R_00000D_SCLK_CNTL 0x00000D | ||
| 215 | #define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0) | ||
| 216 | #define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7) | ||
| 217 | #define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8 | ||
| 218 | #define S_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 3) | ||
| 219 | #define G_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) >> 3) & 0x1) | ||
| 220 | #define C_00000D_CP_MAX_DYN_STOP_LAT 0xFFFFFFF7 | ||
| 221 | #define S_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 4) | ||
| 222 | #define G_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) >> 4) & 0x1) | ||
| 223 | #define C_00000D_HDP_MAX_DYN_STOP_LAT 0xFFFFFFEF | ||
| 224 | #define S_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 5) | ||
| 225 | #define G_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) >> 5) & 0x1) | ||
| 226 | #define C_00000D_TV_MAX_DYN_STOP_LAT 0xFFFFFFDF | ||
| 227 | #define S_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 6) | ||
| 228 | #define G_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) >> 6) & 0x1) | ||
| 229 | #define C_00000D_E2_MAX_DYN_STOP_LAT 0xFFFFFFBF | ||
| 230 | #define S_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 7) | ||
| 231 | #define G_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) >> 7) & 0x1) | ||
| 232 | #define C_00000D_SE_MAX_DYN_STOP_LAT 0xFFFFFF7F | ||
| 233 | #define S_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 8) | ||
| 234 | #define G_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 8) & 0x1) | ||
| 235 | #define C_00000D_IDCT_MAX_DYN_STOP_LAT 0xFFFFFEFF | ||
| 236 | #define S_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 9) | ||
| 237 | #define G_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) >> 9) & 0x1) | ||
| 238 | #define C_00000D_VIP_MAX_DYN_STOP_LAT 0xFFFFFDFF | ||
| 239 | #define S_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 10) | ||
| 240 | #define G_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) >> 10) & 0x1) | ||
| 241 | #define C_00000D_RE_MAX_DYN_STOP_LAT 0xFFFFFBFF | ||
| 242 | #define S_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 11) | ||
| 243 | #define G_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) >> 11) & 0x1) | ||
| 244 | #define C_00000D_PB_MAX_DYN_STOP_LAT 0xFFFFF7FF | ||
| 245 | #define S_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 12) | ||
| 246 | #define G_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) >> 12) & 0x1) | ||
| 247 | #define C_00000D_TAM_MAX_DYN_STOP_LAT 0xFFFFEFFF | ||
| 248 | #define S_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 13) | ||
| 249 | #define G_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) >> 13) & 0x1) | ||
| 250 | #define C_00000D_TDM_MAX_DYN_STOP_LAT 0xFFFFDFFF | ||
| 251 | #define S_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 14) | ||
| 252 | #define G_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) >> 14) & 0x1) | ||
| 253 | #define C_00000D_RB_MAX_DYN_STOP_LAT 0xFFFFBFFF | ||
| 254 | #define S_00000D_FORCE_DISP2(x) (((x) & 0x1) << 15) | ||
| 255 | #define G_00000D_FORCE_DISP2(x) (((x) >> 15) & 0x1) | ||
| 256 | #define C_00000D_FORCE_DISP2 0xFFFF7FFF | ||
| 257 | #define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16) | ||
| 258 | #define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1) | ||
| 259 | #define C_00000D_FORCE_CP 0xFFFEFFFF | ||
| 260 | #define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17) | ||
| 261 | #define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1) | ||
| 262 | #define C_00000D_FORCE_HDP 0xFFFDFFFF | ||
| 263 | #define S_00000D_FORCE_DISP1(x) (((x) & 0x1) << 18) | ||
| 264 | #define G_00000D_FORCE_DISP1(x) (((x) >> 18) & 0x1) | ||
| 265 | #define C_00000D_FORCE_DISP1 0xFFFBFFFF | ||
| 266 | #define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19) | ||
| 267 | #define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1) | ||
| 268 | #define C_00000D_FORCE_TOP 0xFFF7FFFF | ||
| 269 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | ||
| 270 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | ||
| 271 | #define C_00000D_FORCE_E2 0xFFEFFFFF | ||
| 272 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | ||
| 273 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | ||
| 274 | #define C_00000D_FORCE_SE 0xFFDFFFFF | ||
| 275 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | ||
| 276 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | ||
| 277 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | ||
| 278 | #define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23) | ||
| 279 | #define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1) | ||
| 280 | #define C_00000D_FORCE_VIP 0xFF7FFFFF | ||
| 281 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | ||
| 282 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | ||
| 283 | #define C_00000D_FORCE_RE 0xFEFFFFFF | ||
| 284 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | ||
| 285 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | ||
| 286 | #define C_00000D_FORCE_PB 0xFDFFFFFF | ||
| 287 | #define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26) | ||
| 288 | #define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1) | ||
| 289 | #define C_00000D_FORCE_TAM 0xFBFFFFFF | ||
| 290 | #define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27) | ||
| 291 | #define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1) | ||
| 292 | #define C_00000D_FORCE_TDM 0xF7FFFFFF | ||
| 293 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | ||
| 294 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | ||
| 295 | #define C_00000D_FORCE_RB 0xEFFFFFFF | ||
| 296 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) | ||
| 297 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) | ||
| 298 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF | ||
| 299 | #define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30) | ||
| 300 | #define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1) | ||
| 301 | #define C_00000D_FORCE_SUBPIC 0xBFFFFFFF | ||
| 302 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) | ||
| 303 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) | ||
| 304 | #define C_00000D_FORCE_OV0 0x7FFFFFFF | ||
| 305 | |||
| 101 | #endif | 306 | #endif |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 49a2fdc57d27..5c7fe52de30e 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -155,6 +155,9 @@ static void r420_debugfs(struct radeon_device *rdev) | |||
| 155 | static void r420_clock_resume(struct radeon_device *rdev) | 155 | static void r420_clock_resume(struct radeon_device *rdev) |
| 156 | { | 156 | { |
| 157 | u32 sclk_cntl; | 157 | u32 sclk_cntl; |
| 158 | |||
| 159 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
| 160 | radeon_atom_set_clock_gating(rdev, 1); | ||
| 158 | sclk_cntl = RREG32_PLL(R_00000D_SCLK_CNTL); | 161 | sclk_cntl = RREG32_PLL(R_00000D_SCLK_CNTL); |
| 159 | sclk_cntl |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); | 162 | sclk_cntl |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); |
| 160 | if (rdev->family == CHIP_R420) | 163 | if (rdev->family == CHIP_R420) |
| @@ -167,6 +170,8 @@ static int r420_startup(struct radeon_device *rdev) | |||
| 167 | int r; | 170 | int r; |
| 168 | 171 | ||
| 169 | r300_mc_program(rdev); | 172 | r300_mc_program(rdev); |
| 173 | /* Resume clock */ | ||
| 174 | r420_clock_resume(rdev); | ||
| 170 | /* Initialize GART (initialize after TTM so we can allocate | 175 | /* Initialize GART (initialize after TTM so we can allocate |
| 171 | * memory through TTM but finalize after TTM) */ | 176 | * memory through TTM but finalize after TTM) */ |
| 172 | if (rdev->flags & RADEON_IS_PCIE) { | 177 | if (rdev->flags & RADEON_IS_PCIE) { |
| @@ -267,7 +272,6 @@ int r420_init(struct radeon_device *rdev) | |||
| 267 | { | 272 | { |
| 268 | int r; | 273 | int r; |
| 269 | 274 | ||
| 270 | rdev->new_init_path = true; | ||
| 271 | /* Initialize scratch registers */ | 275 | /* Initialize scratch registers */ |
| 272 | radeon_scratch_init(rdev); | 276 | radeon_scratch_init(rdev); |
| 273 | /* Initialize surface registers */ | 277 | /* Initialize surface registers */ |
diff --git a/drivers/gpu/drm/radeon/r420d.h b/drivers/gpu/drm/radeon/r420d.h index a48a7db1e2aa..fc78d31a0b4a 100644 --- a/drivers/gpu/drm/radeon/r420d.h +++ b/drivers/gpu/drm/radeon/r420d.h | |||
| @@ -212,9 +212,9 @@ | |||
| 212 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | 212 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) |
| 213 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | 213 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) |
| 214 | #define C_00000D_FORCE_E2 0xFFEFFFFF | 214 | #define C_00000D_FORCE_E2 0xFFEFFFFF |
| 215 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | 215 | #define S_00000D_FORCE_VAP(x) (((x) & 0x1) << 21) |
| 216 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | 216 | #define G_00000D_FORCE_VAP(x) (((x) >> 21) & 0x1) |
| 217 | #define C_00000D_FORCE_SE 0xFFDFFFFF | 217 | #define C_00000D_FORCE_VAP 0xFFDFFFFF |
| 218 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | 218 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) |
| 219 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | 219 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) |
| 220 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | 220 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF |
| @@ -224,24 +224,24 @@ | |||
| 224 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | 224 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) |
| 225 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | 225 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) |
| 226 | #define C_00000D_FORCE_RE 0xFEFFFFFF | 226 | #define C_00000D_FORCE_RE 0xFEFFFFFF |
| 227 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | 227 | #define S_00000D_FORCE_SR(x) (((x) & 0x1) << 25) |
| 228 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | 228 | #define G_00000D_FORCE_SR(x) (((x) >> 25) & 0x1) |
| 229 | #define C_00000D_FORCE_PB 0xFDFFFFFF | 229 | #define C_00000D_FORCE_SR 0xFDFFFFFF |
| 230 | #define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26) | 230 | #define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26) |
| 231 | #define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1) | 231 | #define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1) |
| 232 | #define C_00000D_FORCE_PX 0xFBFFFFFF | 232 | #define C_00000D_FORCE_PX 0xFBFFFFFF |
| 233 | #define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27) | 233 | #define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27) |
| 234 | #define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1) | 234 | #define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1) |
| 235 | #define C_00000D_FORCE_TX 0xF7FFFFFF | 235 | #define C_00000D_FORCE_TX 0xF7FFFFFF |
| 236 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | 236 | #define S_00000D_FORCE_US(x) (((x) & 0x1) << 28) |
| 237 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | 237 | #define G_00000D_FORCE_US(x) (((x) >> 28) & 0x1) |
| 238 | #define C_00000D_FORCE_RB 0xEFFFFFFF | 238 | #define C_00000D_FORCE_US 0xEFFFFFFF |
| 239 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) | 239 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) |
| 240 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) | 240 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) |
| 241 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF | 241 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF |
| 242 | #define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30) | 242 | #define S_00000D_FORCE_SU(x) (((x) & 0x1) << 30) |
| 243 | #define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1) | 243 | #define G_00000D_FORCE_SU(x) (((x) >> 30) & 0x1) |
| 244 | #define C_00000D_FORCE_SUBPIC 0xBFFFFFFF | 244 | #define C_00000D_FORCE_SU 0xBFFFFFFF |
| 245 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) | 245 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) |
| 246 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) | 246 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) |
| 247 | #define C_00000D_FORCE_OV0 0x7FFFFFFF | 247 | #define C_00000D_FORCE_OV0 0x7FFFFFFF |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 0bf13fccdaf2..a555b7b19b48 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -186,7 +186,7 @@ static int r520_startup(struct radeon_device *rdev) | |||
| 186 | } | 186 | } |
| 187 | /* Enable IRQ */ | 187 | /* Enable IRQ */ |
| 188 | rdev->irq.sw_int = true; | 188 | rdev->irq.sw_int = true; |
| 189 | r100_irq_set(rdev); | 189 | rs600_irq_set(rdev); |
| 190 | /* 1M ring buffer */ | 190 | /* 1M ring buffer */ |
| 191 | r = r100_cp_init(rdev, 1024 * 1024); | 191 | r = r100_cp_init(rdev, 1024 * 1024); |
| 192 | if (r) { | 192 | if (r) { |
| @@ -228,7 +228,6 @@ int r520_init(struct radeon_device *rdev) | |||
| 228 | { | 228 | { |
| 229 | int r; | 229 | int r; |
| 230 | 230 | ||
| 231 | rdev->new_init_path = true; | ||
| 232 | /* Initialize scratch registers */ | 231 | /* Initialize scratch registers */ |
| 233 | radeon_scratch_init(rdev); | 232 | radeon_scratch_init(rdev); |
| 234 | /* Initialize surface registers */ | 233 | /* Initialize surface registers */ |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 2e4e60edbff4..609719490ec2 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -65,16 +65,11 @@ MODULE_FIRMWARE("radeon/RV710_me.bin"); | |||
| 65 | 65 | ||
| 66 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); | 66 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); |
| 67 | 67 | ||
| 68 | /* This files gather functions specifics to: | 68 | /* r600,rv610,rv630,rv620,rv635,rv670 */ |
| 69 | * r600,rv610,rv630,rv620,rv635,rv670 | ||
| 70 | * | ||
| 71 | * Some of these functions might be used by newer ASICs. | ||
| 72 | */ | ||
| 73 | int r600_mc_wait_for_idle(struct radeon_device *rdev); | 69 | int r600_mc_wait_for_idle(struct radeon_device *rdev); |
| 74 | void r600_gpu_init(struct radeon_device *rdev); | 70 | void r600_gpu_init(struct radeon_device *rdev); |
| 75 | void r600_fini(struct radeon_device *rdev); | 71 | void r600_fini(struct radeon_device *rdev); |
| 76 | 72 | ||
| 77 | |||
| 78 | /* | 73 | /* |
| 79 | * R600 PCIE GART | 74 | * R600 PCIE GART |
| 80 | */ | 75 | */ |
| @@ -168,7 +163,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev) | |||
| 168 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | 163 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); |
| 169 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | 164 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); |
| 170 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 165 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
| 171 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 166 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
| 172 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 167 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
| 173 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 168 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
| 174 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 169 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
| @@ -225,6 +220,40 @@ void r600_pcie_gart_fini(struct radeon_device *rdev) | |||
| 225 | radeon_gart_fini(rdev); | 220 | radeon_gart_fini(rdev); |
| 226 | } | 221 | } |
| 227 | 222 | ||
| 223 | void r600_agp_enable(struct radeon_device *rdev) | ||
| 224 | { | ||
| 225 | u32 tmp; | ||
| 226 | int i; | ||
| 227 | |||
| 228 | /* Setup L2 cache */ | ||
| 229 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | | ||
| 230 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | | ||
| 231 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
| 232 | WREG32(VM_L2_CNTL2, 0); | ||
| 233 | WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1)); | ||
| 234 | /* Setup TLB control */ | ||
| 235 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
| 236 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
| 237 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) | | ||
| 238 | ENABLE_WAIT_L2_QUERY; | ||
| 239 | WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp); | ||
| 240 | WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); | ||
| 241 | WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING); | ||
| 242 | WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); | ||
| 243 | WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp); | ||
| 244 | WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp); | ||
| 245 | WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp); | ||
| 246 | WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp); | ||
| 247 | WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp); | ||
| 248 | WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp); | ||
| 249 | WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp); | ||
| 250 | WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp); | ||
| 251 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | ||
| 252 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | ||
| 253 | for (i = 0; i < 7; i++) | ||
| 254 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
| 255 | } | ||
| 256 | |||
| 228 | int r600_mc_wait_for_idle(struct radeon_device *rdev) | 257 | int r600_mc_wait_for_idle(struct radeon_device *rdev) |
| 229 | { | 258 | { |
| 230 | unsigned i; | 259 | unsigned i; |
| @@ -240,14 +269,9 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev) | |||
| 240 | return -1; | 269 | return -1; |
| 241 | } | 270 | } |
| 242 | 271 | ||
| 243 | static void r600_mc_resume(struct radeon_device *rdev) | 272 | static void r600_mc_program(struct radeon_device *rdev) |
| 244 | { | 273 | { |
| 245 | u32 d1vga_control, d2vga_control; | 274 | struct rv515_mc_save save; |
| 246 | u32 vga_render_control, vga_hdp_control; | ||
| 247 | u32 d1crtc_control, d2crtc_control; | ||
| 248 | u32 new_d1grph_primary, new_d1grph_secondary; | ||
| 249 | u32 new_d2grph_primary, new_d2grph_secondary; | ||
| 250 | u64 old_vram_start; | ||
| 251 | u32 tmp; | 275 | u32 tmp; |
| 252 | int i, j; | 276 | int i, j; |
| 253 | 277 | ||
| @@ -261,85 +285,51 @@ static void r600_mc_resume(struct radeon_device *rdev) | |||
| 261 | } | 285 | } |
| 262 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); | 286 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); |
| 263 | 287 | ||
| 264 | d1vga_control = RREG32(D1VGA_CONTROL); | 288 | rv515_mc_stop(rdev, &save); |
| 265 | d2vga_control = RREG32(D2VGA_CONTROL); | ||
| 266 | vga_render_control = RREG32(VGA_RENDER_CONTROL); | ||
| 267 | vga_hdp_control = RREG32(VGA_HDP_CONTROL); | ||
| 268 | d1crtc_control = RREG32(D1CRTC_CONTROL); | ||
| 269 | d2crtc_control = RREG32(D2CRTC_CONTROL); | ||
| 270 | old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; | ||
| 271 | new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS); | ||
| 272 | new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS); | ||
| 273 | new_d1grph_primary += rdev->mc.vram_start - old_vram_start; | ||
| 274 | new_d1grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
| 275 | new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS); | ||
| 276 | new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS); | ||
| 277 | new_d2grph_primary += rdev->mc.vram_start - old_vram_start; | ||
| 278 | new_d2grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
| 279 | |||
| 280 | /* Stop all video */ | ||
| 281 | WREG32(D1VGA_CONTROL, 0); | ||
| 282 | WREG32(D2VGA_CONTROL, 0); | ||
| 283 | WREG32(VGA_RENDER_CONTROL, 0); | ||
| 284 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
| 285 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
| 286 | WREG32(D1CRTC_CONTROL, 0); | ||
| 287 | WREG32(D2CRTC_CONTROL, 0); | ||
| 288 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
| 289 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
| 290 | |||
| 291 | mdelay(1); | ||
| 292 | if (r600_mc_wait_for_idle(rdev)) { | 289 | if (r600_mc_wait_for_idle(rdev)) { |
| 293 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 290 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
| 294 | } | 291 | } |
| 295 | 292 | /* Lockout access through VGA aperture (doesn't exist before R600) */ | |
| 296 | /* Lockout access through VGA aperture*/ | ||
| 297 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 293 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
| 298 | |||
| 299 | /* Update configuration */ | 294 | /* Update configuration */ |
| 300 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 295 | if (rdev->flags & RADEON_IS_AGP) { |
| 301 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 296 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
| 297 | /* VRAM before AGP */ | ||
| 298 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
| 299 | rdev->mc.vram_start >> 12); | ||
| 300 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
| 301 | rdev->mc.gtt_end >> 12); | ||
| 302 | } else { | ||
| 303 | /* VRAM after AGP */ | ||
| 304 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
| 305 | rdev->mc.gtt_start >> 12); | ||
| 306 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
| 307 | rdev->mc.vram_end >> 12); | ||
| 308 | } | ||
| 309 | } else { | ||
| 310 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | ||
| 311 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end >> 12); | ||
| 312 | } | ||
| 302 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 313 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
| 303 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 314 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
| 304 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 315 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
| 305 | WREG32(MC_VM_FB_LOCATION, tmp); | 316 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 306 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 317 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 307 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 318 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 308 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 319 | WREG32(HDP_NONSURFACE_SIZE, rdev->mc.mc_vram_size | 0x3FF); |
| 309 | if (rdev->flags & RADEON_IS_AGP) { | 320 | if (rdev->flags & RADEON_IS_AGP) { |
| 310 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 321 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); |
| 311 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 322 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); |
| 312 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 323 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
| 313 | } else { | 324 | } else { |
| 314 | WREG32(MC_VM_AGP_BASE, 0); | 325 | WREG32(MC_VM_AGP_BASE, 0); |
| 315 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); | 326 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); |
| 316 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); | 327 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); |
| 317 | } | 328 | } |
| 318 | WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary); | ||
| 319 | WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary); | ||
| 320 | WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary); | ||
| 321 | WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary); | ||
| 322 | WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); | ||
| 323 | |||
| 324 | /* Unlock host access */ | ||
| 325 | WREG32(VGA_HDP_CONTROL, vga_hdp_control); | ||
| 326 | |||
| 327 | mdelay(1); | ||
| 328 | if (r600_mc_wait_for_idle(rdev)) { | 329 | if (r600_mc_wait_for_idle(rdev)) { |
| 329 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 330 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
| 330 | } | 331 | } |
| 331 | 332 | rv515_mc_resume(rdev, &save); | |
| 332 | /* Restore video state */ | ||
| 333 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
| 334 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
| 335 | WREG32(D1CRTC_CONTROL, d1crtc_control); | ||
| 336 | WREG32(D2CRTC_CONTROL, d2crtc_control); | ||
| 337 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
| 338 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
| 339 | WREG32(D1VGA_CONTROL, d1vga_control); | ||
| 340 | WREG32(D2VGA_CONTROL, d2vga_control); | ||
| 341 | WREG32(VGA_RENDER_CONTROL, vga_render_control); | ||
| 342 | |||
| 343 | /* we need to own VRAM, so turn off the VGA renderer here | 333 | /* we need to own VRAM, so turn off the VGA renderer here |
| 344 | * to stop it overwriting our objects */ | 334 | * to stop it overwriting our objects */ |
| 345 | rv515_vga_render_disable(rdev); | 335 | rv515_vga_render_disable(rdev); |
| @@ -445,9 +435,9 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 445 | } | 435 | } |
| 446 | } | 436 | } |
| 447 | rdev->mc.vram_start = rdev->mc.vram_location; | 437 | rdev->mc.vram_start = rdev->mc.vram_location; |
| 448 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 438 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
| 449 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 439 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
| 450 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 440 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
| 451 | /* FIXME: we should enforce default clock in case GPU is not in | 441 | /* FIXME: we should enforce default clock in case GPU is not in |
| 452 | * default setup | 442 | * default setup |
| 453 | */ | 443 | */ |
| @@ -463,6 +453,7 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 463 | */ | 453 | */ |
| 464 | int r600_gpu_soft_reset(struct radeon_device *rdev) | 454 | int r600_gpu_soft_reset(struct radeon_device *rdev) |
| 465 | { | 455 | { |
| 456 | struct rv515_mc_save save; | ||
| 466 | u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | | 457 | u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | |
| 467 | S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | | 458 | S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | |
| 468 | S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | | 459 | S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | |
| @@ -480,13 +471,25 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 480 | S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) | | 471 | S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) | |
| 481 | S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); | 472 | S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); |
| 482 | u32 srbm_reset = 0; | 473 | u32 srbm_reset = 0; |
| 474 | u32 tmp; | ||
| 483 | 475 | ||
| 476 | dev_info(rdev->dev, "GPU softreset \n"); | ||
| 477 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
| 478 | RREG32(R_008010_GRBM_STATUS)); | ||
| 479 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | ||
| 480 | RREG32(R_008014_GRBM_STATUS2)); | ||
| 481 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | ||
| 482 | RREG32(R_000E50_SRBM_STATUS)); | ||
| 483 | rv515_mc_stop(rdev, &save); | ||
| 484 | if (r600_mc_wait_for_idle(rdev)) { | ||
| 485 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
| 486 | } | ||
| 484 | /* Disable CP parsing/prefetching */ | 487 | /* Disable CP parsing/prefetching */ |
| 485 | WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(0xff)); | 488 | WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(0xff)); |
| 486 | /* Check if any of the rendering block is busy and reset it */ | 489 | /* Check if any of the rendering block is busy and reset it */ |
| 487 | if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || | 490 | if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || |
| 488 | (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { | 491 | (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { |
| 489 | WREG32(R_008020_GRBM_SOFT_RESET, S_008020_SOFT_RESET_CR(1) | | 492 | tmp = S_008020_SOFT_RESET_CR(1) | |
| 490 | S_008020_SOFT_RESET_DB(1) | | 493 | S_008020_SOFT_RESET_DB(1) | |
| 491 | S_008020_SOFT_RESET_CB(1) | | 494 | S_008020_SOFT_RESET_CB(1) | |
| 492 | S_008020_SOFT_RESET_PA(1) | | 495 | S_008020_SOFT_RESET_PA(1) | |
| @@ -498,14 +501,18 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 498 | S_008020_SOFT_RESET_TC(1) | | 501 | S_008020_SOFT_RESET_TC(1) | |
| 499 | S_008020_SOFT_RESET_TA(1) | | 502 | S_008020_SOFT_RESET_TA(1) | |
| 500 | S_008020_SOFT_RESET_VC(1) | | 503 | S_008020_SOFT_RESET_VC(1) | |
| 501 | S_008020_SOFT_RESET_VGT(1)); | 504 | S_008020_SOFT_RESET_VGT(1); |
| 505 | dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); | ||
| 506 | WREG32(R_008020_GRBM_SOFT_RESET, tmp); | ||
| 502 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 507 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
| 503 | udelay(50); | 508 | udelay(50); |
| 504 | WREG32(R_008020_GRBM_SOFT_RESET, 0); | 509 | WREG32(R_008020_GRBM_SOFT_RESET, 0); |
| 505 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 510 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
| 506 | } | 511 | } |
| 507 | /* Reset CP (we always reset CP) */ | 512 | /* Reset CP (we always reset CP) */ |
| 508 | WREG32(R_008020_GRBM_SOFT_RESET, S_008020_SOFT_RESET_CP(1)); | 513 | tmp = S_008020_SOFT_RESET_CP(1); |
| 514 | dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); | ||
| 515 | WREG32(R_008020_GRBM_SOFT_RESET, tmp); | ||
| 509 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 516 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
| 510 | udelay(50); | 517 | udelay(50); |
| 511 | WREG32(R_008020_GRBM_SOFT_RESET, 0); | 518 | WREG32(R_008020_GRBM_SOFT_RESET, 0); |
| @@ -533,6 +540,14 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 533 | srbm_reset |= S_000E60_SOFT_RESET_RLC(1); | 540 | srbm_reset |= S_000E60_SOFT_RESET_RLC(1); |
| 534 | if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS))) | 541 | if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS))) |
| 535 | srbm_reset |= S_000E60_SOFT_RESET_SEM(1); | 542 | srbm_reset |= S_000E60_SOFT_RESET_SEM(1); |
| 543 | if (G_000E50_BIF_BUSY(RREG32(R_000E50_SRBM_STATUS))) | ||
| 544 | srbm_reset |= S_000E60_SOFT_RESET_BIF(1); | ||
| 545 | dev_info(rdev->dev, " R_000E60_SRBM_SOFT_RESET=0x%08X\n", srbm_reset); | ||
| 546 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); | ||
| 547 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | ||
| 548 | udelay(50); | ||
| 549 | WREG32(R_000E60_SRBM_SOFT_RESET, 0); | ||
| 550 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | ||
| 536 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); | 551 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); |
| 537 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | 552 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); |
| 538 | udelay(50); | 553 | udelay(50); |
| @@ -540,6 +555,17 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
| 540 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | 555 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); |
| 541 | /* Wait a little for things to settle down */ | 556 | /* Wait a little for things to settle down */ |
| 542 | udelay(50); | 557 | udelay(50); |
| 558 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
| 559 | RREG32(R_008010_GRBM_STATUS)); | ||
| 560 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | ||
| 561 | RREG32(R_008014_GRBM_STATUS2)); | ||
| 562 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | ||
| 563 | RREG32(R_000E50_SRBM_STATUS)); | ||
| 564 | /* After reset we need to reinit the asic as GPU often endup in an | ||
| 565 | * incoherent state. | ||
| 566 | */ | ||
| 567 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 568 | rv515_mc_resume(rdev, &save); | ||
| 543 | return 0; | 569 | return 0; |
| 544 | } | 570 | } |
| 545 | 571 | ||
| @@ -1350,32 +1376,47 @@ int r600_ring_test(struct radeon_device *rdev) | |||
| 1350 | return r; | 1376 | return r; |
| 1351 | } | 1377 | } |
| 1352 | 1378 | ||
| 1353 | /* | 1379 | void r600_wb_disable(struct radeon_device *rdev) |
| 1354 | * Writeback | 1380 | { |
| 1355 | */ | 1381 | WREG32(SCRATCH_UMSK, 0); |
| 1356 | int r600_wb_init(struct radeon_device *rdev) | 1382 | if (rdev->wb.wb_obj) { |
| 1383 | radeon_object_kunmap(rdev->wb.wb_obj); | ||
| 1384 | radeon_object_unpin(rdev->wb.wb_obj); | ||
| 1385 | } | ||
| 1386 | } | ||
| 1387 | |||
| 1388 | void r600_wb_fini(struct radeon_device *rdev) | ||
| 1389 | { | ||
| 1390 | r600_wb_disable(rdev); | ||
| 1391 | if (rdev->wb.wb_obj) { | ||
| 1392 | radeon_object_unref(&rdev->wb.wb_obj); | ||
| 1393 | rdev->wb.wb = NULL; | ||
| 1394 | rdev->wb.wb_obj = NULL; | ||
| 1395 | } | ||
| 1396 | } | ||
| 1397 | |||
| 1398 | int r600_wb_enable(struct radeon_device *rdev) | ||
| 1357 | { | 1399 | { |
| 1358 | int r; | 1400 | int r; |
| 1359 | 1401 | ||
| 1360 | if (rdev->wb.wb_obj == NULL) { | 1402 | if (rdev->wb.wb_obj == NULL) { |
| 1361 | r = radeon_object_create(rdev, NULL, 4096, | 1403 | r = radeon_object_create(rdev, NULL, 4096, true, |
| 1362 | true, | 1404 | RADEON_GEM_DOMAIN_GTT, false, &rdev->wb.wb_obj); |
| 1363 | RADEON_GEM_DOMAIN_GTT, | ||
| 1364 | false, &rdev->wb.wb_obj); | ||
| 1365 | if (r) { | 1405 | if (r) { |
| 1366 | DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r); | 1406 | dev_warn(rdev->dev, "failed to create WB buffer (%d).\n", r); |
| 1367 | return r; | 1407 | return r; |
| 1368 | } | 1408 | } |
| 1369 | r = radeon_object_pin(rdev->wb.wb_obj, | 1409 | r = radeon_object_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT, |
| 1370 | RADEON_GEM_DOMAIN_GTT, | 1410 | &rdev->wb.gpu_addr); |
| 1371 | &rdev->wb.gpu_addr); | ||
| 1372 | if (r) { | 1411 | if (r) { |
| 1373 | DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r); | 1412 | dev_warn(rdev->dev, "failed to pin WB buffer (%d).\n", r); |
| 1413 | r600_wb_fini(rdev); | ||
| 1374 | return r; | 1414 | return r; |
| 1375 | } | 1415 | } |
| 1376 | r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); | 1416 | r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); |
| 1377 | if (r) { | 1417 | if (r) { |
| 1378 | DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r); | 1418 | dev_warn(rdev->dev, "failed to map WB buffer (%d).\n", r); |
| 1419 | r600_wb_fini(rdev); | ||
| 1379 | return r; | 1420 | return r; |
| 1380 | } | 1421 | } |
| 1381 | } | 1422 | } |
| @@ -1386,21 +1427,6 @@ int r600_wb_init(struct radeon_device *rdev) | |||
| 1386 | return 0; | 1427 | return 0; |
| 1387 | } | 1428 | } |
| 1388 | 1429 | ||
| 1389 | void r600_wb_fini(struct radeon_device *rdev) | ||
| 1390 | { | ||
| 1391 | if (rdev->wb.wb_obj) { | ||
| 1392 | radeon_object_kunmap(rdev->wb.wb_obj); | ||
| 1393 | radeon_object_unpin(rdev->wb.wb_obj); | ||
| 1394 | radeon_object_unref(&rdev->wb.wb_obj); | ||
| 1395 | rdev->wb.wb = NULL; | ||
| 1396 | rdev->wb.wb_obj = NULL; | ||
| 1397 | } | ||
| 1398 | } | ||
| 1399 | |||
| 1400 | |||
| 1401 | /* | ||
| 1402 | * CS | ||
| 1403 | */ | ||
| 1404 | void r600_fence_ring_emit(struct radeon_device *rdev, | 1430 | void r600_fence_ring_emit(struct radeon_device *rdev, |
| 1405 | struct radeon_fence *fence) | 1431 | struct radeon_fence *fence) |
| 1406 | { | 1432 | { |
| @@ -1477,11 +1503,14 @@ int r600_startup(struct radeon_device *rdev) | |||
| 1477 | { | 1503 | { |
| 1478 | int r; | 1504 | int r; |
| 1479 | 1505 | ||
| 1480 | r600_gpu_reset(rdev); | 1506 | r600_mc_program(rdev); |
| 1481 | r600_mc_resume(rdev); | 1507 | if (rdev->flags & RADEON_IS_AGP) { |
| 1482 | r = r600_pcie_gart_enable(rdev); | 1508 | r600_agp_enable(rdev); |
| 1483 | if (r) | 1509 | } else { |
| 1484 | return r; | 1510 | r = r600_pcie_gart_enable(rdev); |
| 1511 | if (r) | ||
| 1512 | return r; | ||
| 1513 | } | ||
| 1485 | r600_gpu_init(rdev); | 1514 | r600_gpu_init(rdev); |
| 1486 | 1515 | ||
| 1487 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 1516 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
| @@ -1500,9 +1529,8 @@ int r600_startup(struct radeon_device *rdev) | |||
| 1500 | r = r600_cp_resume(rdev); | 1529 | r = r600_cp_resume(rdev); |
| 1501 | if (r) | 1530 | if (r) |
| 1502 | return r; | 1531 | return r; |
| 1503 | r = r600_wb_init(rdev); | 1532 | /* write back buffer are not vital so don't worry about failure */ |
| 1504 | if (r) | 1533 | r600_wb_enable(rdev); |
| 1505 | return r; | ||
| 1506 | return 0; | 1534 | return 0; |
| 1507 | } | 1535 | } |
| 1508 | 1536 | ||
| @@ -1524,15 +1552,12 @@ int r600_resume(struct radeon_device *rdev) | |||
| 1524 | { | 1552 | { |
| 1525 | int r; | 1553 | int r; |
| 1526 | 1554 | ||
| 1527 | if (radeon_gpu_reset(rdev)) { | 1555 | /* Do not reset GPU before posting, on r600 hw unlike on r500 hw, |
| 1528 | /* FIXME: what do we want to do here ? */ | 1556 | * posting will perform necessary task to bring back GPU into good |
| 1529 | } | 1557 | * shape. |
| 1558 | */ | ||
| 1530 | /* post card */ | 1559 | /* post card */ |
| 1531 | if (rdev->is_atom_bios) { | 1560 | atom_asic_init(rdev->mode_info.atom_context); |
| 1532 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 1533 | } else { | ||
| 1534 | radeon_combios_asic_init(rdev->ddev); | ||
| 1535 | } | ||
| 1536 | /* Initialize clocks */ | 1561 | /* Initialize clocks */ |
| 1537 | r = radeon_clocks_init(rdev); | 1562 | r = radeon_clocks_init(rdev); |
| 1538 | if (r) { | 1563 | if (r) { |
| @@ -1545,7 +1570,7 @@ int r600_resume(struct radeon_device *rdev) | |||
| 1545 | return r; | 1570 | return r; |
| 1546 | } | 1571 | } |
| 1547 | 1572 | ||
| 1548 | r = radeon_ib_test(rdev); | 1573 | r = r600_ib_test(rdev); |
| 1549 | if (r) { | 1574 | if (r) { |
| 1550 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1575 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
| 1551 | return r; | 1576 | return r; |
| @@ -1553,13 +1578,12 @@ int r600_resume(struct radeon_device *rdev) | |||
| 1553 | return r; | 1578 | return r; |
| 1554 | } | 1579 | } |
| 1555 | 1580 | ||
| 1556 | |||
| 1557 | int r600_suspend(struct radeon_device *rdev) | 1581 | int r600_suspend(struct radeon_device *rdev) |
| 1558 | { | 1582 | { |
| 1559 | /* FIXME: we should wait for ring to be empty */ | 1583 | /* FIXME: we should wait for ring to be empty */ |
| 1560 | r600_cp_stop(rdev); | 1584 | r600_cp_stop(rdev); |
| 1561 | rdev->cp.ready = false; | 1585 | rdev->cp.ready = false; |
| 1562 | 1586 | r600_wb_disable(rdev); | |
| 1563 | r600_pcie_gart_disable(rdev); | 1587 | r600_pcie_gart_disable(rdev); |
| 1564 | /* unpin shaders bo */ | 1588 | /* unpin shaders bo */ |
| 1565 | radeon_object_unpin(rdev->r600_blit.shader_obj); | 1589 | radeon_object_unpin(rdev->r600_blit.shader_obj); |
| @@ -1576,7 +1600,6 @@ int r600_init(struct radeon_device *rdev) | |||
| 1576 | { | 1600 | { |
| 1577 | int r; | 1601 | int r; |
| 1578 | 1602 | ||
| 1579 | rdev->new_init_path = true; | ||
| 1580 | r = radeon_dummy_page_init(rdev); | 1603 | r = radeon_dummy_page_init(rdev); |
| 1581 | if (r) | 1604 | if (r) |
| 1582 | return r; | 1605 | return r; |
| @@ -1593,8 +1616,10 @@ int r600_init(struct radeon_device *rdev) | |||
| 1593 | return -EINVAL; | 1616 | return -EINVAL; |
| 1594 | } | 1617 | } |
| 1595 | /* Must be an ATOMBIOS */ | 1618 | /* Must be an ATOMBIOS */ |
| 1596 | if (!rdev->is_atom_bios) | 1619 | if (!rdev->is_atom_bios) { |
| 1620 | dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); | ||
| 1597 | return -EINVAL; | 1621 | return -EINVAL; |
| 1622 | } | ||
| 1598 | r = radeon_atombios_init(rdev); | 1623 | r = radeon_atombios_init(rdev); |
| 1599 | if (r) | 1624 | if (r) |
| 1600 | return r; | 1625 | return r; |
| @@ -1616,15 +1641,8 @@ int r600_init(struct radeon_device *rdev) | |||
| 1616 | if (r) | 1641 | if (r) |
| 1617 | return r; | 1642 | return r; |
| 1618 | r = r600_mc_init(rdev); | 1643 | r = r600_mc_init(rdev); |
| 1619 | if (r) { | 1644 | if (r) |
| 1620 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 1621 | /* Retry with disabling AGP */ | ||
| 1622 | r600_fini(rdev); | ||
| 1623 | rdev->flags &= ~RADEON_IS_AGP; | ||
| 1624 | return r600_init(rdev); | ||
| 1625 | } | ||
| 1626 | return r; | 1645 | return r; |
| 1627 | } | ||
| 1628 | /* Memory manager */ | 1646 | /* Memory manager */ |
| 1629 | r = radeon_object_init(rdev); | 1647 | r = radeon_object_init(rdev); |
| 1630 | if (r) | 1648 | if (r) |
| @@ -1653,12 +1671,10 @@ int r600_init(struct radeon_device *rdev) | |||
| 1653 | 1671 | ||
| 1654 | r = r600_startup(rdev); | 1672 | r = r600_startup(rdev); |
| 1655 | if (r) { | 1673 | if (r) { |
| 1656 | if (rdev->flags & RADEON_IS_AGP) { | 1674 | r600_suspend(rdev); |
| 1657 | /* Retry with disabling AGP */ | 1675 | r600_wb_fini(rdev); |
| 1658 | r600_fini(rdev); | 1676 | radeon_ring_fini(rdev); |
| 1659 | rdev->flags &= ~RADEON_IS_AGP; | 1677 | r600_pcie_gart_fini(rdev); |
| 1660 | return r600_init(rdev); | ||
| 1661 | } | ||
| 1662 | rdev->accel_working = false; | 1678 | rdev->accel_working = false; |
| 1663 | } | 1679 | } |
| 1664 | if (rdev->accel_working) { | 1680 | if (rdev->accel_working) { |
| @@ -1667,7 +1683,7 @@ int r600_init(struct radeon_device *rdev) | |||
| 1667 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); | 1683 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); |
| 1668 | rdev->accel_working = false; | 1684 | rdev->accel_working = false; |
| 1669 | } | 1685 | } |
| 1670 | r = radeon_ib_test(rdev); | 1686 | r = r600_ib_test(rdev); |
| 1671 | if (r) { | 1687 | if (r) { |
| 1672 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1688 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
| 1673 | rdev->accel_working = false; | 1689 | rdev->accel_working = false; |
| @@ -1683,19 +1699,15 @@ void r600_fini(struct radeon_device *rdev) | |||
| 1683 | 1699 | ||
| 1684 | r600_blit_fini(rdev); | 1700 | r600_blit_fini(rdev); |
| 1685 | radeon_ring_fini(rdev); | 1701 | radeon_ring_fini(rdev); |
| 1702 | r600_wb_fini(rdev); | ||
| 1686 | r600_pcie_gart_fini(rdev); | 1703 | r600_pcie_gart_fini(rdev); |
| 1687 | radeon_gem_fini(rdev); | 1704 | radeon_gem_fini(rdev); |
| 1688 | radeon_fence_driver_fini(rdev); | 1705 | radeon_fence_driver_fini(rdev); |
| 1689 | radeon_clocks_fini(rdev); | 1706 | radeon_clocks_fini(rdev); |
| 1690 | #if __OS_HAS_AGP | ||
| 1691 | if (rdev->flags & RADEON_IS_AGP) | 1707 | if (rdev->flags & RADEON_IS_AGP) |
| 1692 | radeon_agp_fini(rdev); | 1708 | radeon_agp_fini(rdev); |
| 1693 | #endif | ||
| 1694 | radeon_object_fini(rdev); | 1709 | radeon_object_fini(rdev); |
| 1695 | if (rdev->is_atom_bios) | 1710 | radeon_atombios_fini(rdev); |
| 1696 | radeon_atombios_fini(rdev); | ||
| 1697 | else | ||
| 1698 | radeon_combios_fini(rdev); | ||
| 1699 | kfree(rdev->bios); | 1711 | kfree(rdev->bios); |
| 1700 | rdev->bios = NULL; | 1712 | rdev->bios = NULL; |
| 1701 | radeon_dummy_page_fini(rdev); | 1713 | radeon_dummy_page_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600_blit.c b/drivers/gpu/drm/radeon/r600_blit.c index d988eece0187..dec501081608 100644 --- a/drivers/gpu/drm/radeon/r600_blit.c +++ b/drivers/gpu/drm/radeon/r600_blit.c | |||
| @@ -582,8 +582,6 @@ r600_blit_copy(struct drm_device *dev, | |||
| 582 | u64 vb_addr; | 582 | u64 vb_addr; |
| 583 | u32 *vb; | 583 | u32 *vb; |
| 584 | 584 | ||
| 585 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 586 | |||
| 587 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { | 585 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { |
| 588 | max_bytes = 8192; | 586 | max_bytes = 8192; |
| 589 | 587 | ||
| @@ -619,8 +617,8 @@ r600_blit_copy(struct drm_device *dev, | |||
| 619 | if (!dev_priv->blit_vb) | 617 | if (!dev_priv->blit_vb) |
| 620 | return; | 618 | return; |
| 621 | set_shaders(dev); | 619 | set_shaders(dev); |
| 622 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 623 | } | 620 | } |
| 621 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 624 | 622 | ||
| 625 | vb[0] = i2f(dst_x); | 623 | vb[0] = i2f(dst_x); |
| 626 | vb[1] = 0; | 624 | vb[1] = 0; |
| @@ -708,8 +706,8 @@ r600_blit_copy(struct drm_device *dev, | |||
| 708 | return; | 706 | return; |
| 709 | 707 | ||
| 710 | set_shaders(dev); | 708 | set_shaders(dev); |
| 711 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 712 | } | 709 | } |
| 710 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 713 | 711 | ||
| 714 | vb[0] = i2f(dst_x / 4); | 712 | vb[0] = i2f(dst_x / 4); |
| 715 | vb[1] = 0; | 713 | vb[1] = 0; |
| @@ -777,8 +775,6 @@ r600_blit_swap(struct drm_device *dev, | |||
| 777 | u64 vb_addr; | 775 | u64 vb_addr; |
| 778 | u32 *vb; | 776 | u32 *vb; |
| 779 | 777 | ||
| 780 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 781 | |||
| 782 | if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { | 778 | if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { |
| 783 | 779 | ||
| 784 | r600_nomm_put_vb(dev); | 780 | r600_nomm_put_vb(dev); |
| @@ -787,8 +783,8 @@ r600_blit_swap(struct drm_device *dev, | |||
| 787 | return; | 783 | return; |
| 788 | 784 | ||
| 789 | set_shaders(dev); | 785 | set_shaders(dev); |
| 790 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 791 | } | 786 | } |
| 787 | vb = r600_nomm_get_vb_ptr(dev); | ||
| 792 | 788 | ||
| 793 | if (cpp == 4) { | 789 | if (cpp == 4) { |
| 794 | cb_format = COLOR_8_8_8_8; | 790 | cb_format = COLOR_8_8_8_8; |
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c index acae33e2ad51..93108bb31d1d 100644 --- a/drivers/gpu/drm/radeon/r600_blit_kms.c +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c | |||
| @@ -610,7 +610,6 @@ void r600_kms_blit_copy(struct radeon_device *rdev, | |||
| 610 | 610 | ||
| 611 | DRM_DEBUG("emitting copy %16llx %16llx %d %d\n", src_gpu_addr, dst_gpu_addr, | 611 | DRM_DEBUG("emitting copy %16llx %16llx %d %d\n", src_gpu_addr, dst_gpu_addr, |
| 612 | size_bytes, rdev->r600_blit.vb_used); | 612 | size_bytes, rdev->r600_blit.vb_used); |
| 613 | vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used); | ||
| 614 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { | 613 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { |
| 615 | max_bytes = 8192; | 614 | max_bytes = 8192; |
| 616 | 615 | ||
| @@ -653,6 +652,7 @@ void r600_kms_blit_copy(struct radeon_device *rdev, | |||
| 653 | vb = r600_nomm_get_vb_ptr(dev); | 652 | vb = r600_nomm_get_vb_ptr(dev); |
| 654 | #endif | 653 | #endif |
| 655 | } | 654 | } |
| 655 | vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used); | ||
| 656 | 656 | ||
| 657 | vb[0] = i2f(dst_x); | 657 | vb[0] = i2f(dst_x); |
| 658 | vb[1] = 0; | 658 | vb[1] = 0; |
| @@ -747,6 +747,7 @@ void r600_kms_blit_copy(struct radeon_device *rdev, | |||
| 747 | vb = r600_nomm_get_vb_ptr(dev); | 747 | vb = r600_nomm_get_vb_ptr(dev); |
| 748 | } | 748 | } |
| 749 | #endif | 749 | #endif |
| 750 | vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used); | ||
| 750 | 751 | ||
| 751 | vb[0] = i2f(dst_x / 4); | 752 | vb[0] = i2f(dst_x / 4); |
| 752 | vb[1] = 0; | 753 | vb[1] = 0; |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index d28970db6a2d..17e42195c632 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
| @@ -252,7 +252,7 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p) | |||
| 252 | 252 | ||
| 253 | header = radeon_get_ib_value(p, h_idx); | 253 | header = radeon_get_ib_value(p, h_idx); |
| 254 | crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1); | 254 | crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1); |
| 255 | reg = header >> 2; | 255 | reg = CP_PACKET0_GET_REG(header); |
| 256 | mutex_lock(&p->rdev->ddev->mode_config.mutex); | 256 | mutex_lock(&p->rdev->ddev->mode_config.mutex); |
| 257 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); | 257 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); |
| 258 | if (!obj) { | 258 | if (!obj) { |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 4a9028a85c9b..9b64d47f1f82 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -643,6 +643,7 @@ | |||
| 643 | #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) | 643 | #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) |
| 644 | #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) | 644 | #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) |
| 645 | #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) | 645 | #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) |
| 646 | #define G_000E50_BIF_BUSY(x) (((x) >> 29) & 1) | ||
| 646 | #define R_000E60_SRBM_SOFT_RESET 0x0E60 | 647 | #define R_000E60_SRBM_SOFT_RESET 0x0E60 |
| 647 | #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1) | 648 | #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1) |
| 648 | #define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2) | 649 | #define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 950b346e343f..5ab35b81c86b 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -590,18 +590,8 @@ struct radeon_asic { | |||
| 590 | void (*fini)(struct radeon_device *rdev); | 590 | void (*fini)(struct radeon_device *rdev); |
| 591 | int (*resume)(struct radeon_device *rdev); | 591 | int (*resume)(struct radeon_device *rdev); |
| 592 | int (*suspend)(struct radeon_device *rdev); | 592 | int (*suspend)(struct radeon_device *rdev); |
| 593 | void (*errata)(struct radeon_device *rdev); | ||
| 594 | void (*vram_info)(struct radeon_device *rdev); | ||
| 595 | void (*vga_set_state)(struct radeon_device *rdev, bool state); | 593 | void (*vga_set_state)(struct radeon_device *rdev, bool state); |
| 596 | int (*gpu_reset)(struct radeon_device *rdev); | 594 | int (*gpu_reset)(struct radeon_device *rdev); |
| 597 | int (*mc_init)(struct radeon_device *rdev); | ||
| 598 | void (*mc_fini)(struct radeon_device *rdev); | ||
| 599 | int (*wb_init)(struct radeon_device *rdev); | ||
| 600 | void (*wb_fini)(struct radeon_device *rdev); | ||
| 601 | int (*gart_init)(struct radeon_device *rdev); | ||
| 602 | void (*gart_fini)(struct radeon_device *rdev); | ||
| 603 | int (*gart_enable)(struct radeon_device *rdev); | ||
| 604 | void (*gart_disable)(struct radeon_device *rdev); | ||
| 605 | void (*gart_tlb_flush)(struct radeon_device *rdev); | 595 | void (*gart_tlb_flush)(struct radeon_device *rdev); |
| 606 | int (*gart_set_page)(struct radeon_device *rdev, int i, uint64_t addr); | 596 | int (*gart_set_page)(struct radeon_device *rdev, int i, uint64_t addr); |
| 607 | int (*cp_init)(struct radeon_device *rdev, unsigned ring_size); | 597 | int (*cp_init)(struct radeon_device *rdev, unsigned ring_size); |
| @@ -611,7 +601,6 @@ struct radeon_asic { | |||
| 611 | void (*ring_start)(struct radeon_device *rdev); | 601 | void (*ring_start)(struct radeon_device *rdev); |
| 612 | int (*ring_test)(struct radeon_device *rdev); | 602 | int (*ring_test)(struct radeon_device *rdev); |
| 613 | void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); | 603 | void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); |
| 614 | int (*ib_test)(struct radeon_device *rdev); | ||
| 615 | int (*irq_set)(struct radeon_device *rdev); | 604 | int (*irq_set)(struct radeon_device *rdev); |
| 616 | int (*irq_process)(struct radeon_device *rdev); | 605 | int (*irq_process)(struct radeon_device *rdev); |
| 617 | u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); | 606 | u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); |
| @@ -789,7 +778,6 @@ struct radeon_device { | |||
| 789 | bool shutdown; | 778 | bool shutdown; |
| 790 | bool suspend; | 779 | bool suspend; |
| 791 | bool need_dma32; | 780 | bool need_dma32; |
| 792 | bool new_init_path; | ||
| 793 | bool accel_working; | 781 | bool accel_working; |
| 794 | struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES]; | 782 | struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES]; |
| 795 | const struct firmware *me_fw; /* all family ME firmware */ | 783 | const struct firmware *me_fw; /* all family ME firmware */ |
| @@ -949,28 +937,14 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
| 949 | #define radeon_resume(rdev) (rdev)->asic->resume((rdev)) | 937 | #define radeon_resume(rdev) (rdev)->asic->resume((rdev)) |
| 950 | #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) | 938 | #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) |
| 951 | #define radeon_cs_parse(p) rdev->asic->cs_parse((p)) | 939 | #define radeon_cs_parse(p) rdev->asic->cs_parse((p)) |
| 952 | #define radeon_errata(rdev) (rdev)->asic->errata((rdev)) | ||
| 953 | #define radeon_vram_info(rdev) (rdev)->asic->vram_info((rdev)) | ||
| 954 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) | 940 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) |
| 955 | #define radeon_gpu_reset(rdev) (rdev)->asic->gpu_reset((rdev)) | 941 | #define radeon_gpu_reset(rdev) (rdev)->asic->gpu_reset((rdev)) |
| 956 | #define radeon_mc_init(rdev) (rdev)->asic->mc_init((rdev)) | ||
| 957 | #define radeon_mc_fini(rdev) (rdev)->asic->mc_fini((rdev)) | ||
| 958 | #define radeon_wb_init(rdev) (rdev)->asic->wb_init((rdev)) | ||
| 959 | #define radeon_wb_fini(rdev) (rdev)->asic->wb_fini((rdev)) | ||
| 960 | #define radeon_gpu_gart_init(rdev) (rdev)->asic->gart_init((rdev)) | ||
| 961 | #define radeon_gpu_gart_fini(rdev) (rdev)->asic->gart_fini((rdev)) | ||
| 962 | #define radeon_gart_enable(rdev) (rdev)->asic->gart_enable((rdev)) | ||
| 963 | #define radeon_gart_disable(rdev) (rdev)->asic->gart_disable((rdev)) | ||
| 964 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev)) | 942 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev)) |
| 965 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart_set_page((rdev), (i), (p)) | 943 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart_set_page((rdev), (i), (p)) |
| 966 | #define radeon_cp_init(rdev,rsize) (rdev)->asic->cp_init((rdev), (rsize)) | ||
| 967 | #define radeon_cp_fini(rdev) (rdev)->asic->cp_fini((rdev)) | ||
| 968 | #define radeon_cp_disable(rdev) (rdev)->asic->cp_disable((rdev)) | ||
| 969 | #define radeon_cp_commit(rdev) (rdev)->asic->cp_commit((rdev)) | 944 | #define radeon_cp_commit(rdev) (rdev)->asic->cp_commit((rdev)) |
| 970 | #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) | 945 | #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) |
| 971 | #define radeon_ring_test(rdev) (rdev)->asic->ring_test((rdev)) | 946 | #define radeon_ring_test(rdev) (rdev)->asic->ring_test((rdev)) |
| 972 | #define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib)) | 947 | #define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib)) |
| 973 | #define radeon_ib_test(rdev) (rdev)->asic->ib_test((rdev)) | ||
| 974 | #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) | 948 | #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) |
| 975 | #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) | 949 | #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) |
| 976 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc)) | 950 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc)) |
| @@ -996,6 +970,7 @@ extern void radeon_clocks_fini(struct radeon_device *rdev); | |||
| 996 | extern void radeon_scratch_init(struct radeon_device *rdev); | 970 | extern void radeon_scratch_init(struct radeon_device *rdev); |
| 997 | extern void radeon_surface_init(struct radeon_device *rdev); | 971 | extern void radeon_surface_init(struct radeon_device *rdev); |
| 998 | extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data); | 972 | extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data); |
| 973 | extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable); | ||
| 999 | extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); | 974 | extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); |
| 1000 | 975 | ||
| 1001 | /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ | 976 | /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ |
| @@ -1031,11 +1006,27 @@ extern int r100_wb_init(struct radeon_device *rdev); | |||
| 1031 | extern void r100_hdp_reset(struct radeon_device *rdev); | 1006 | extern void r100_hdp_reset(struct radeon_device *rdev); |
| 1032 | extern int r100_rb2d_reset(struct radeon_device *rdev); | 1007 | extern int r100_rb2d_reset(struct radeon_device *rdev); |
| 1033 | extern int r100_cp_reset(struct radeon_device *rdev); | 1008 | extern int r100_cp_reset(struct radeon_device *rdev); |
| 1009 | extern void r100_vga_render_disable(struct radeon_device *rdev); | ||
| 1010 | extern int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
| 1011 | struct radeon_cs_packet *pkt, | ||
| 1012 | struct radeon_object *robj); | ||
| 1013 | extern int r100_cs_parse_packet0(struct radeon_cs_parser *p, | ||
| 1014 | struct radeon_cs_packet *pkt, | ||
| 1015 | const unsigned *auth, unsigned n, | ||
| 1016 | radeon_packet0_check_t check); | ||
| 1017 | extern int r100_cs_packet_parse(struct radeon_cs_parser *p, | ||
| 1018 | struct radeon_cs_packet *pkt, | ||
| 1019 | unsigned idx); | ||
| 1020 | |||
| 1021 | /* rv200,rv250,rv280 */ | ||
| 1022 | extern void r200_set_safe_registers(struct radeon_device *rdev); | ||
| 1034 | 1023 | ||
| 1035 | /* r300,r350,rv350,rv370,rv380 */ | 1024 | /* r300,r350,rv350,rv370,rv380 */ |
| 1036 | extern void r300_set_reg_safe(struct radeon_device *rdev); | 1025 | extern void r300_set_reg_safe(struct radeon_device *rdev); |
| 1037 | extern void r300_mc_program(struct radeon_device *rdev); | 1026 | extern void r300_mc_program(struct radeon_device *rdev); |
| 1038 | extern void r300_vram_info(struct radeon_device *rdev); | 1027 | extern void r300_vram_info(struct radeon_device *rdev); |
| 1028 | extern void r300_clock_startup(struct radeon_device *rdev); | ||
| 1029 | extern int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 1039 | extern int rv370_pcie_gart_init(struct radeon_device *rdev); | 1030 | extern int rv370_pcie_gart_init(struct radeon_device *rdev); |
| 1040 | extern void rv370_pcie_gart_fini(struct radeon_device *rdev); | 1031 | extern void rv370_pcie_gart_fini(struct radeon_device *rdev); |
| 1041 | extern int rv370_pcie_gart_enable(struct radeon_device *rdev); | 1032 | extern int rv370_pcie_gart_enable(struct radeon_device *rdev); |
| @@ -1066,6 +1057,18 @@ extern void rv515_clock_startup(struct radeon_device *rdev); | |||
| 1066 | extern void rv515_debugfs(struct radeon_device *rdev); | 1057 | extern void rv515_debugfs(struct radeon_device *rdev); |
| 1067 | extern int rv515_suspend(struct radeon_device *rdev); | 1058 | extern int rv515_suspend(struct radeon_device *rdev); |
| 1068 | 1059 | ||
| 1060 | /* rs400 */ | ||
| 1061 | extern int rs400_gart_init(struct radeon_device *rdev); | ||
| 1062 | extern int rs400_gart_enable(struct radeon_device *rdev); | ||
| 1063 | extern void rs400_gart_adjust_size(struct radeon_device *rdev); | ||
| 1064 | extern void rs400_gart_disable(struct radeon_device *rdev); | ||
| 1065 | extern void rs400_gart_fini(struct radeon_device *rdev); | ||
| 1066 | |||
| 1067 | /* rs600 */ | ||
| 1068 | extern void rs600_set_safe_registers(struct radeon_device *rdev); | ||
| 1069 | extern int rs600_irq_set(struct radeon_device *rdev); | ||
| 1070 | extern void rs600_irq_disable(struct radeon_device *rdev); | ||
| 1071 | |||
| 1069 | /* rs690, rs740 */ | 1072 | /* rs690, rs740 */ |
| 1070 | extern void rs690_line_buffer_adjust(struct radeon_device *rdev, | 1073 | extern void rs690_line_buffer_adjust(struct radeon_device *rdev, |
| 1071 | struct drm_display_mode *mode1, | 1074 | struct drm_display_mode *mode1, |
| @@ -1083,8 +1086,9 @@ extern int r600_pcie_gart_init(struct radeon_device *rdev); | |||
| 1083 | extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); | 1086 | extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); |
| 1084 | extern int r600_ib_test(struct radeon_device *rdev); | 1087 | extern int r600_ib_test(struct radeon_device *rdev); |
| 1085 | extern int r600_ring_test(struct radeon_device *rdev); | 1088 | extern int r600_ring_test(struct radeon_device *rdev); |
| 1086 | extern int r600_wb_init(struct radeon_device *rdev); | ||
| 1087 | extern void r600_wb_fini(struct radeon_device *rdev); | 1089 | extern void r600_wb_fini(struct radeon_device *rdev); |
| 1090 | extern int r600_wb_enable(struct radeon_device *rdev); | ||
| 1091 | extern void r600_wb_disable(struct radeon_device *rdev); | ||
| 1088 | extern void r600_scratch_init(struct radeon_device *rdev); | 1092 | extern void r600_scratch_init(struct radeon_device *rdev); |
| 1089 | extern int r600_blit_init(struct radeon_device *rdev); | 1093 | extern int r600_blit_init(struct radeon_device *rdev); |
| 1090 | extern void r600_blit_fini(struct radeon_device *rdev); | 1094 | extern void r600_blit_fini(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index c8a4e7b5663d..c3532c7a6f3f 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -41,28 +41,17 @@ void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); | |||
| 41 | /* | 41 | /* |
| 42 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 42 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
| 43 | */ | 43 | */ |
| 44 | int r100_init(struct radeon_device *rdev); | 44 | extern int r100_init(struct radeon_device *rdev); |
| 45 | int r200_init(struct radeon_device *rdev); | 45 | extern void r100_fini(struct radeon_device *rdev); |
| 46 | extern int r100_suspend(struct radeon_device *rdev); | ||
| 47 | extern int r100_resume(struct radeon_device *rdev); | ||
| 46 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); | 48 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); |
| 47 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 49 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 48 | void r100_errata(struct radeon_device *rdev); | ||
| 49 | void r100_vram_info(struct radeon_device *rdev); | ||
| 50 | void r100_vga_set_state(struct radeon_device *rdev, bool state); | 50 | void r100_vga_set_state(struct radeon_device *rdev, bool state); |
| 51 | int r100_gpu_reset(struct radeon_device *rdev); | 51 | int r100_gpu_reset(struct radeon_device *rdev); |
| 52 | int r100_mc_init(struct radeon_device *rdev); | ||
| 53 | void r100_mc_fini(struct radeon_device *rdev); | ||
| 54 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | 52 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); |
| 55 | int r100_wb_init(struct radeon_device *rdev); | ||
| 56 | void r100_wb_fini(struct radeon_device *rdev); | ||
| 57 | int r100_pci_gart_init(struct radeon_device *rdev); | ||
| 58 | void r100_pci_gart_fini(struct radeon_device *rdev); | ||
| 59 | int r100_pci_gart_enable(struct radeon_device *rdev); | ||
| 60 | void r100_pci_gart_disable(struct radeon_device *rdev); | ||
| 61 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | 53 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); |
| 62 | int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 54 | int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
| 63 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | ||
| 64 | void r100_cp_fini(struct radeon_device *rdev); | ||
| 65 | void r100_cp_disable(struct radeon_device *rdev); | ||
| 66 | void r100_cp_commit(struct radeon_device *rdev); | 55 | void r100_cp_commit(struct radeon_device *rdev); |
| 67 | void r100_ring_start(struct radeon_device *rdev); | 56 | void r100_ring_start(struct radeon_device *rdev); |
| 68 | int r100_irq_set(struct radeon_device *rdev); | 57 | int r100_irq_set(struct radeon_device *rdev); |
| @@ -83,33 +72,21 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, | |||
| 83 | int r100_clear_surface_reg(struct radeon_device *rdev, int reg); | 72 | int r100_clear_surface_reg(struct radeon_device *rdev, int reg); |
| 84 | void r100_bandwidth_update(struct radeon_device *rdev); | 73 | void r100_bandwidth_update(struct radeon_device *rdev); |
| 85 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 74 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
| 86 | int r100_ib_test(struct radeon_device *rdev); | ||
| 87 | int r100_ring_test(struct radeon_device *rdev); | 75 | int r100_ring_test(struct radeon_device *rdev); |
| 88 | 76 | ||
| 89 | static struct radeon_asic r100_asic = { | 77 | static struct radeon_asic r100_asic = { |
| 90 | .init = &r100_init, | 78 | .init = &r100_init, |
| 91 | .errata = &r100_errata, | 79 | .fini = &r100_fini, |
| 92 | .vram_info = &r100_vram_info, | 80 | .suspend = &r100_suspend, |
| 81 | .resume = &r100_resume, | ||
| 93 | .vga_set_state = &r100_vga_set_state, | 82 | .vga_set_state = &r100_vga_set_state, |
| 94 | .gpu_reset = &r100_gpu_reset, | 83 | .gpu_reset = &r100_gpu_reset, |
| 95 | .mc_init = &r100_mc_init, | ||
| 96 | .mc_fini = &r100_mc_fini, | ||
| 97 | .wb_init = &r100_wb_init, | ||
| 98 | .wb_fini = &r100_wb_fini, | ||
| 99 | .gart_init = &r100_pci_gart_init, | ||
| 100 | .gart_fini = &r100_pci_gart_fini, | ||
| 101 | .gart_enable = &r100_pci_gart_enable, | ||
| 102 | .gart_disable = &r100_pci_gart_disable, | ||
| 103 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, | 84 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, |
| 104 | .gart_set_page = &r100_pci_gart_set_page, | 85 | .gart_set_page = &r100_pci_gart_set_page, |
| 105 | .cp_init = &r100_cp_init, | ||
| 106 | .cp_fini = &r100_cp_fini, | ||
| 107 | .cp_disable = &r100_cp_disable, | ||
| 108 | .cp_commit = &r100_cp_commit, | 86 | .cp_commit = &r100_cp_commit, |
| 109 | .ring_start = &r100_ring_start, | 87 | .ring_start = &r100_ring_start, |
| 110 | .ring_test = &r100_ring_test, | 88 | .ring_test = &r100_ring_test, |
| 111 | .ring_ib_execute = &r100_ring_ib_execute, | 89 | .ring_ib_execute = &r100_ring_ib_execute, |
| 112 | .ib_test = &r100_ib_test, | ||
| 113 | .irq_set = &r100_irq_set, | 90 | .irq_set = &r100_irq_set, |
| 114 | .irq_process = &r100_irq_process, | 91 | .irq_process = &r100_irq_process, |
| 115 | .get_vblank_counter = &r100_get_vblank_counter, | 92 | .get_vblank_counter = &r100_get_vblank_counter, |
| @@ -131,55 +108,38 @@ static struct radeon_asic r100_asic = { | |||
| 131 | /* | 108 | /* |
| 132 | * r300,r350,rv350,rv380 | 109 | * r300,r350,rv350,rv380 |
| 133 | */ | 110 | */ |
| 134 | int r300_init(struct radeon_device *rdev); | 111 | extern int r300_init(struct radeon_device *rdev); |
| 135 | void r300_errata(struct radeon_device *rdev); | 112 | extern void r300_fini(struct radeon_device *rdev); |
| 136 | void r300_vram_info(struct radeon_device *rdev); | 113 | extern int r300_suspend(struct radeon_device *rdev); |
| 137 | int r300_gpu_reset(struct radeon_device *rdev); | 114 | extern int r300_resume(struct radeon_device *rdev); |
| 138 | int r300_mc_init(struct radeon_device *rdev); | 115 | extern int r300_gpu_reset(struct radeon_device *rdev); |
| 139 | void r300_mc_fini(struct radeon_device *rdev); | 116 | extern void r300_ring_start(struct radeon_device *rdev); |
| 140 | void r300_ring_start(struct radeon_device *rdev); | 117 | extern void r300_fence_ring_emit(struct radeon_device *rdev, |
| 141 | void r300_fence_ring_emit(struct radeon_device *rdev, | 118 | struct radeon_fence *fence); |
| 142 | struct radeon_fence *fence); | 119 | extern int r300_cs_parse(struct radeon_cs_parser *p); |
| 143 | int r300_cs_parse(struct radeon_cs_parser *p); | 120 | extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); |
| 144 | int rv370_pcie_gart_init(struct radeon_device *rdev); | 121 | extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
| 145 | void rv370_pcie_gart_fini(struct radeon_device *rdev); | 122 | extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg); |
| 146 | int rv370_pcie_gart_enable(struct radeon_device *rdev); | 123 | extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 147 | void rv370_pcie_gart_disable(struct radeon_device *rdev); | 124 | extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); |
| 148 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); | 125 | extern int r300_copy_dma(struct radeon_device *rdev, |
| 149 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 126 | uint64_t src_offset, |
| 150 | uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg); | 127 | uint64_t dst_offset, |
| 151 | void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 128 | unsigned num_pages, |
| 152 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); | 129 | struct radeon_fence *fence); |
| 153 | int r300_copy_dma(struct radeon_device *rdev, | ||
| 154 | uint64_t src_offset, | ||
| 155 | uint64_t dst_offset, | ||
| 156 | unsigned num_pages, | ||
| 157 | struct radeon_fence *fence); | ||
| 158 | |||
| 159 | static struct radeon_asic r300_asic = { | 130 | static struct radeon_asic r300_asic = { |
| 160 | .init = &r300_init, | 131 | .init = &r300_init, |
| 161 | .errata = &r300_errata, | 132 | .fini = &r300_fini, |
| 162 | .vram_info = &r300_vram_info, | 133 | .suspend = &r300_suspend, |
| 134 | .resume = &r300_resume, | ||
| 163 | .vga_set_state = &r100_vga_set_state, | 135 | .vga_set_state = &r100_vga_set_state, |
| 164 | .gpu_reset = &r300_gpu_reset, | 136 | .gpu_reset = &r300_gpu_reset, |
| 165 | .mc_init = &r300_mc_init, | ||
| 166 | .mc_fini = &r300_mc_fini, | ||
| 167 | .wb_init = &r100_wb_init, | ||
| 168 | .wb_fini = &r100_wb_fini, | ||
| 169 | .gart_init = &r100_pci_gart_init, | ||
| 170 | .gart_fini = &r100_pci_gart_fini, | ||
| 171 | .gart_enable = &r100_pci_gart_enable, | ||
| 172 | .gart_disable = &r100_pci_gart_disable, | ||
| 173 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, | 137 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, |
| 174 | .gart_set_page = &r100_pci_gart_set_page, | 138 | .gart_set_page = &r100_pci_gart_set_page, |
| 175 | .cp_init = &r100_cp_init, | ||
| 176 | .cp_fini = &r100_cp_fini, | ||
| 177 | .cp_disable = &r100_cp_disable, | ||
| 178 | .cp_commit = &r100_cp_commit, | 139 | .cp_commit = &r100_cp_commit, |
| 179 | .ring_start = &r300_ring_start, | 140 | .ring_start = &r300_ring_start, |
| 180 | .ring_test = &r100_ring_test, | 141 | .ring_test = &r100_ring_test, |
| 181 | .ring_ib_execute = &r100_ring_ib_execute, | 142 | .ring_ib_execute = &r100_ring_ib_execute, |
| 182 | .ib_test = &r100_ib_test, | ||
| 183 | .irq_set = &r100_irq_set, | 143 | .irq_set = &r100_irq_set, |
| 184 | .irq_process = &r100_irq_process, | 144 | .irq_process = &r100_irq_process, |
| 185 | .get_vblank_counter = &r100_get_vblank_counter, | 145 | .get_vblank_counter = &r100_get_vblank_counter, |
| @@ -209,26 +169,14 @@ static struct radeon_asic r420_asic = { | |||
| 209 | .fini = &r420_fini, | 169 | .fini = &r420_fini, |
| 210 | .suspend = &r420_suspend, | 170 | .suspend = &r420_suspend, |
| 211 | .resume = &r420_resume, | 171 | .resume = &r420_resume, |
| 212 | .errata = NULL, | ||
| 213 | .vram_info = NULL, | ||
| 214 | .vga_set_state = &r100_vga_set_state, | 172 | .vga_set_state = &r100_vga_set_state, |
| 215 | .gpu_reset = &r300_gpu_reset, | 173 | .gpu_reset = &r300_gpu_reset, |
| 216 | .mc_init = NULL, | ||
| 217 | .mc_fini = NULL, | ||
| 218 | .wb_init = NULL, | ||
| 219 | .wb_fini = NULL, | ||
| 220 | .gart_enable = NULL, | ||
| 221 | .gart_disable = NULL, | ||
| 222 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 174 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 223 | .gart_set_page = &rv370_pcie_gart_set_page, | 175 | .gart_set_page = &rv370_pcie_gart_set_page, |
| 224 | .cp_init = NULL, | ||
| 225 | .cp_fini = NULL, | ||
| 226 | .cp_disable = NULL, | ||
| 227 | .cp_commit = &r100_cp_commit, | 176 | .cp_commit = &r100_cp_commit, |
| 228 | .ring_start = &r300_ring_start, | 177 | .ring_start = &r300_ring_start, |
| 229 | .ring_test = &r100_ring_test, | 178 | .ring_test = &r100_ring_test, |
| 230 | .ring_ib_execute = &r100_ring_ib_execute, | 179 | .ring_ib_execute = &r100_ring_ib_execute, |
| 231 | .ib_test = NULL, | ||
| 232 | .irq_set = &r100_irq_set, | 180 | .irq_set = &r100_irq_set, |
| 233 | .irq_process = &r100_irq_process, | 181 | .irq_process = &r100_irq_process, |
| 234 | .get_vblank_counter = &r100_get_vblank_counter, | 182 | .get_vblank_counter = &r100_get_vblank_counter, |
| @@ -250,42 +198,27 @@ static struct radeon_asic r420_asic = { | |||
| 250 | /* | 198 | /* |
| 251 | * rs400,rs480 | 199 | * rs400,rs480 |
| 252 | */ | 200 | */ |
| 253 | void rs400_errata(struct radeon_device *rdev); | 201 | extern int rs400_init(struct radeon_device *rdev); |
| 254 | void rs400_vram_info(struct radeon_device *rdev); | 202 | extern void rs400_fini(struct radeon_device *rdev); |
| 255 | int rs400_mc_init(struct radeon_device *rdev); | 203 | extern int rs400_suspend(struct radeon_device *rdev); |
| 256 | void rs400_mc_fini(struct radeon_device *rdev); | 204 | extern int rs400_resume(struct radeon_device *rdev); |
| 257 | int rs400_gart_init(struct radeon_device *rdev); | ||
| 258 | void rs400_gart_fini(struct radeon_device *rdev); | ||
| 259 | int rs400_gart_enable(struct radeon_device *rdev); | ||
| 260 | void rs400_gart_disable(struct radeon_device *rdev); | ||
| 261 | void rs400_gart_tlb_flush(struct radeon_device *rdev); | 205 | void rs400_gart_tlb_flush(struct radeon_device *rdev); |
| 262 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 206 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
| 263 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 207 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 264 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 208 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 265 | static struct radeon_asic rs400_asic = { | 209 | static struct radeon_asic rs400_asic = { |
| 266 | .init = &r300_init, | 210 | .init = &rs400_init, |
| 267 | .errata = &rs400_errata, | 211 | .fini = &rs400_fini, |
| 268 | .vram_info = &rs400_vram_info, | 212 | .suspend = &rs400_suspend, |
| 213 | .resume = &rs400_resume, | ||
| 269 | .vga_set_state = &r100_vga_set_state, | 214 | .vga_set_state = &r100_vga_set_state, |
| 270 | .gpu_reset = &r300_gpu_reset, | 215 | .gpu_reset = &r300_gpu_reset, |
| 271 | .mc_init = &rs400_mc_init, | ||
| 272 | .mc_fini = &rs400_mc_fini, | ||
| 273 | .wb_init = &r100_wb_init, | ||
| 274 | .wb_fini = &r100_wb_fini, | ||
| 275 | .gart_init = &rs400_gart_init, | ||
| 276 | .gart_fini = &rs400_gart_fini, | ||
| 277 | .gart_enable = &rs400_gart_enable, | ||
| 278 | .gart_disable = &rs400_gart_disable, | ||
| 279 | .gart_tlb_flush = &rs400_gart_tlb_flush, | 216 | .gart_tlb_flush = &rs400_gart_tlb_flush, |
| 280 | .gart_set_page = &rs400_gart_set_page, | 217 | .gart_set_page = &rs400_gart_set_page, |
| 281 | .cp_init = &r100_cp_init, | ||
| 282 | .cp_fini = &r100_cp_fini, | ||
| 283 | .cp_disable = &r100_cp_disable, | ||
| 284 | .cp_commit = &r100_cp_commit, | 218 | .cp_commit = &r100_cp_commit, |
| 285 | .ring_start = &r300_ring_start, | 219 | .ring_start = &r300_ring_start, |
| 286 | .ring_test = &r100_ring_test, | 220 | .ring_test = &r100_ring_test, |
| 287 | .ring_ib_execute = &r100_ring_ib_execute, | 221 | .ring_ib_execute = &r100_ring_ib_execute, |
| 288 | .ib_test = &r100_ib_test, | ||
| 289 | .irq_set = &r100_irq_set, | 222 | .irq_set = &r100_irq_set, |
| 290 | .irq_process = &r100_irq_process, | 223 | .irq_process = &r100_irq_process, |
| 291 | .get_vblank_counter = &r100_get_vblank_counter, | 224 | .get_vblank_counter = &r100_get_vblank_counter, |
| @@ -307,18 +240,13 @@ static struct radeon_asic rs400_asic = { | |||
| 307 | /* | 240 | /* |
| 308 | * rs600. | 241 | * rs600. |
| 309 | */ | 242 | */ |
| 310 | int rs600_init(struct radeon_device *rdev); | 243 | extern int rs600_init(struct radeon_device *rdev); |
| 311 | void rs600_errata(struct radeon_device *rdev); | 244 | extern void rs600_fini(struct radeon_device *rdev); |
| 312 | void rs600_vram_info(struct radeon_device *rdev); | 245 | extern int rs600_suspend(struct radeon_device *rdev); |
| 313 | int rs600_mc_init(struct radeon_device *rdev); | 246 | extern int rs600_resume(struct radeon_device *rdev); |
| 314 | void rs600_mc_fini(struct radeon_device *rdev); | ||
| 315 | int rs600_irq_set(struct radeon_device *rdev); | 247 | int rs600_irq_set(struct radeon_device *rdev); |
| 316 | int rs600_irq_process(struct radeon_device *rdev); | 248 | int rs600_irq_process(struct radeon_device *rdev); |
| 317 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); | 249 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); |
| 318 | int rs600_gart_init(struct radeon_device *rdev); | ||
| 319 | void rs600_gart_fini(struct radeon_device *rdev); | ||
| 320 | int rs600_gart_enable(struct radeon_device *rdev); | ||
| 321 | void rs600_gart_disable(struct radeon_device *rdev); | ||
| 322 | void rs600_gart_tlb_flush(struct radeon_device *rdev); | 250 | void rs600_gart_tlb_flush(struct radeon_device *rdev); |
| 323 | int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 251 | int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
| 324 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 252 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| @@ -326,28 +254,17 @@ void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | |||
| 326 | void rs600_bandwidth_update(struct radeon_device *rdev); | 254 | void rs600_bandwidth_update(struct radeon_device *rdev); |
| 327 | static struct radeon_asic rs600_asic = { | 255 | static struct radeon_asic rs600_asic = { |
| 328 | .init = &rs600_init, | 256 | .init = &rs600_init, |
| 329 | .errata = &rs600_errata, | 257 | .fini = &rs600_fini, |
| 330 | .vram_info = &rs600_vram_info, | 258 | .suspend = &rs600_suspend, |
| 259 | .resume = &rs600_resume, | ||
| 331 | .vga_set_state = &r100_vga_set_state, | 260 | .vga_set_state = &r100_vga_set_state, |
| 332 | .gpu_reset = &r300_gpu_reset, | 261 | .gpu_reset = &r300_gpu_reset, |
| 333 | .mc_init = &rs600_mc_init, | ||
| 334 | .mc_fini = &rs600_mc_fini, | ||
| 335 | .wb_init = &r100_wb_init, | ||
| 336 | .wb_fini = &r100_wb_fini, | ||
| 337 | .gart_init = &rs600_gart_init, | ||
| 338 | .gart_fini = &rs600_gart_fini, | ||
| 339 | .gart_enable = &rs600_gart_enable, | ||
| 340 | .gart_disable = &rs600_gart_disable, | ||
| 341 | .gart_tlb_flush = &rs600_gart_tlb_flush, | 262 | .gart_tlb_flush = &rs600_gart_tlb_flush, |
| 342 | .gart_set_page = &rs600_gart_set_page, | 263 | .gart_set_page = &rs600_gart_set_page, |
| 343 | .cp_init = &r100_cp_init, | ||
| 344 | .cp_fini = &r100_cp_fini, | ||
| 345 | .cp_disable = &r100_cp_disable, | ||
| 346 | .cp_commit = &r100_cp_commit, | 264 | .cp_commit = &r100_cp_commit, |
| 347 | .ring_start = &r300_ring_start, | 265 | .ring_start = &r300_ring_start, |
| 348 | .ring_test = &r100_ring_test, | 266 | .ring_test = &r100_ring_test, |
| 349 | .ring_ib_execute = &r100_ring_ib_execute, | 267 | .ring_ib_execute = &r100_ring_ib_execute, |
| 350 | .ib_test = &r100_ib_test, | ||
| 351 | .irq_set = &rs600_irq_set, | 268 | .irq_set = &rs600_irq_set, |
| 352 | .irq_process = &rs600_irq_process, | 269 | .irq_process = &rs600_irq_process, |
| 353 | .get_vblank_counter = &rs600_get_vblank_counter, | 270 | .get_vblank_counter = &rs600_get_vblank_counter, |
| @@ -367,37 +284,26 @@ static struct radeon_asic rs600_asic = { | |||
| 367 | /* | 284 | /* |
| 368 | * rs690,rs740 | 285 | * rs690,rs740 |
| 369 | */ | 286 | */ |
| 370 | void rs690_errata(struct radeon_device *rdev); | 287 | int rs690_init(struct radeon_device *rdev); |
| 371 | void rs690_vram_info(struct radeon_device *rdev); | 288 | void rs690_fini(struct radeon_device *rdev); |
| 372 | int rs690_mc_init(struct radeon_device *rdev); | 289 | int rs690_resume(struct radeon_device *rdev); |
| 373 | void rs690_mc_fini(struct radeon_device *rdev); | 290 | int rs690_suspend(struct radeon_device *rdev); |
| 374 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 291 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
| 375 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 292 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
| 376 | void rs690_bandwidth_update(struct radeon_device *rdev); | 293 | void rs690_bandwidth_update(struct radeon_device *rdev); |
| 377 | static struct radeon_asic rs690_asic = { | 294 | static struct radeon_asic rs690_asic = { |
| 378 | .init = &rs600_init, | 295 | .init = &rs690_init, |
| 379 | .errata = &rs690_errata, | 296 | .fini = &rs690_fini, |
| 380 | .vram_info = &rs690_vram_info, | 297 | .suspend = &rs690_suspend, |
| 298 | .resume = &rs690_resume, | ||
| 381 | .vga_set_state = &r100_vga_set_state, | 299 | .vga_set_state = &r100_vga_set_state, |
| 382 | .gpu_reset = &r300_gpu_reset, | 300 | .gpu_reset = &r300_gpu_reset, |
| 383 | .mc_init = &rs690_mc_init, | ||
| 384 | .mc_fini = &rs690_mc_fini, | ||
| 385 | .wb_init = &r100_wb_init, | ||
| 386 | .wb_fini = &r100_wb_fini, | ||
| 387 | .gart_init = &rs400_gart_init, | ||
| 388 | .gart_fini = &rs400_gart_fini, | ||
| 389 | .gart_enable = &rs400_gart_enable, | ||
| 390 | .gart_disable = &rs400_gart_disable, | ||
| 391 | .gart_tlb_flush = &rs400_gart_tlb_flush, | 301 | .gart_tlb_flush = &rs400_gart_tlb_flush, |
| 392 | .gart_set_page = &rs400_gart_set_page, | 302 | .gart_set_page = &rs400_gart_set_page, |
| 393 | .cp_init = &r100_cp_init, | ||
| 394 | .cp_fini = &r100_cp_fini, | ||
| 395 | .cp_disable = &r100_cp_disable, | ||
| 396 | .cp_commit = &r100_cp_commit, | 303 | .cp_commit = &r100_cp_commit, |
| 397 | .ring_start = &r300_ring_start, | 304 | .ring_start = &r300_ring_start, |
| 398 | .ring_test = &r100_ring_test, | 305 | .ring_test = &r100_ring_test, |
| 399 | .ring_ib_execute = &r100_ring_ib_execute, | 306 | .ring_ib_execute = &r100_ring_ib_execute, |
| 400 | .ib_test = &r100_ib_test, | ||
| 401 | .irq_set = &rs600_irq_set, | 307 | .irq_set = &rs600_irq_set, |
| 402 | .irq_process = &rs600_irq_process, | 308 | .irq_process = &rs600_irq_process, |
| 403 | .get_vblank_counter = &rs600_get_vblank_counter, | 309 | .get_vblank_counter = &rs600_get_vblank_counter, |
| @@ -435,28 +341,14 @@ static struct radeon_asic rv515_asic = { | |||
| 435 | .fini = &rv515_fini, | 341 | .fini = &rv515_fini, |
| 436 | .suspend = &rv515_suspend, | 342 | .suspend = &rv515_suspend, |
| 437 | .resume = &rv515_resume, | 343 | .resume = &rv515_resume, |
| 438 | .errata = NULL, | ||
| 439 | .vram_info = NULL, | ||
| 440 | .vga_set_state = &r100_vga_set_state, | 344 | .vga_set_state = &r100_vga_set_state, |
| 441 | .gpu_reset = &rv515_gpu_reset, | 345 | .gpu_reset = &rv515_gpu_reset, |
| 442 | .mc_init = NULL, | ||
| 443 | .mc_fini = NULL, | ||
| 444 | .wb_init = NULL, | ||
| 445 | .wb_fini = NULL, | ||
| 446 | .gart_init = &rv370_pcie_gart_init, | ||
| 447 | .gart_fini = &rv370_pcie_gart_fini, | ||
| 448 | .gart_enable = NULL, | ||
| 449 | .gart_disable = NULL, | ||
| 450 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 346 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 451 | .gart_set_page = &rv370_pcie_gart_set_page, | 347 | .gart_set_page = &rv370_pcie_gart_set_page, |
| 452 | .cp_init = NULL, | ||
| 453 | .cp_fini = NULL, | ||
| 454 | .cp_disable = NULL, | ||
| 455 | .cp_commit = &r100_cp_commit, | 348 | .cp_commit = &r100_cp_commit, |
| 456 | .ring_start = &rv515_ring_start, | 349 | .ring_start = &rv515_ring_start, |
| 457 | .ring_test = &r100_ring_test, | 350 | .ring_test = &r100_ring_test, |
| 458 | .ring_ib_execute = &r100_ring_ib_execute, | 351 | .ring_ib_execute = &r100_ring_ib_execute, |
| 459 | .ib_test = NULL, | ||
| 460 | .irq_set = &rs600_irq_set, | 352 | .irq_set = &rs600_irq_set, |
| 461 | .irq_process = &rs600_irq_process, | 353 | .irq_process = &rs600_irq_process, |
| 462 | .get_vblank_counter = &rs600_get_vblank_counter, | 354 | .get_vblank_counter = &rs600_get_vblank_counter, |
| @@ -485,28 +377,14 @@ static struct radeon_asic r520_asic = { | |||
| 485 | .fini = &rv515_fini, | 377 | .fini = &rv515_fini, |
| 486 | .suspend = &rv515_suspend, | 378 | .suspend = &rv515_suspend, |
| 487 | .resume = &r520_resume, | 379 | .resume = &r520_resume, |
| 488 | .errata = NULL, | ||
| 489 | .vram_info = NULL, | ||
| 490 | .vga_set_state = &r100_vga_set_state, | 380 | .vga_set_state = &r100_vga_set_state, |
| 491 | .gpu_reset = &rv515_gpu_reset, | 381 | .gpu_reset = &rv515_gpu_reset, |
| 492 | .mc_init = NULL, | ||
| 493 | .mc_fini = NULL, | ||
| 494 | .wb_init = NULL, | ||
| 495 | .wb_fini = NULL, | ||
| 496 | .gart_init = NULL, | ||
| 497 | .gart_fini = NULL, | ||
| 498 | .gart_enable = NULL, | ||
| 499 | .gart_disable = NULL, | ||
| 500 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 382 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
| 501 | .gart_set_page = &rv370_pcie_gart_set_page, | 383 | .gart_set_page = &rv370_pcie_gart_set_page, |
| 502 | .cp_init = NULL, | ||
| 503 | .cp_fini = NULL, | ||
| 504 | .cp_disable = NULL, | ||
| 505 | .cp_commit = &r100_cp_commit, | 384 | .cp_commit = &r100_cp_commit, |
| 506 | .ring_start = &rv515_ring_start, | 385 | .ring_start = &rv515_ring_start, |
| 507 | .ring_test = &r100_ring_test, | 386 | .ring_test = &r100_ring_test, |
| 508 | .ring_ib_execute = &r100_ring_ib_execute, | 387 | .ring_ib_execute = &r100_ring_ib_execute, |
| 509 | .ib_test = NULL, | ||
| 510 | .irq_set = &rs600_irq_set, | 388 | .irq_set = &rs600_irq_set, |
| 511 | .irq_process = &rs600_irq_process, | 389 | .irq_process = &rs600_irq_process, |
| 512 | .get_vblank_counter = &rs600_get_vblank_counter, | 390 | .get_vblank_counter = &rs600_get_vblank_counter, |
| @@ -554,37 +432,23 @@ int r600_set_surface_reg(struct radeon_device *rdev, int reg, | |||
| 554 | uint32_t offset, uint32_t obj_size); | 432 | uint32_t offset, uint32_t obj_size); |
| 555 | int r600_clear_surface_reg(struct radeon_device *rdev, int reg); | 433 | int r600_clear_surface_reg(struct radeon_device *rdev, int reg); |
| 556 | void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 434 | void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
| 557 | int r600_ib_test(struct radeon_device *rdev); | ||
| 558 | int r600_ring_test(struct radeon_device *rdev); | 435 | int r600_ring_test(struct radeon_device *rdev); |
| 559 | int r600_copy_blit(struct radeon_device *rdev, | 436 | int r600_copy_blit(struct radeon_device *rdev, |
| 560 | uint64_t src_offset, uint64_t dst_offset, | 437 | uint64_t src_offset, uint64_t dst_offset, |
| 561 | unsigned num_pages, struct radeon_fence *fence); | 438 | unsigned num_pages, struct radeon_fence *fence); |
| 562 | 439 | ||
| 563 | static struct radeon_asic r600_asic = { | 440 | static struct radeon_asic r600_asic = { |
| 564 | .errata = NULL, | ||
| 565 | .init = &r600_init, | 441 | .init = &r600_init, |
| 566 | .fini = &r600_fini, | 442 | .fini = &r600_fini, |
| 567 | .suspend = &r600_suspend, | 443 | .suspend = &r600_suspend, |
| 568 | .resume = &r600_resume, | 444 | .resume = &r600_resume, |
| 569 | .cp_commit = &r600_cp_commit, | 445 | .cp_commit = &r600_cp_commit, |
| 570 | .vram_info = NULL, | ||
| 571 | .vga_set_state = &r600_vga_set_state, | 446 | .vga_set_state = &r600_vga_set_state, |
| 572 | .gpu_reset = &r600_gpu_reset, | 447 | .gpu_reset = &r600_gpu_reset, |
| 573 | .mc_init = NULL, | ||
| 574 | .mc_fini = NULL, | ||
| 575 | .wb_init = &r600_wb_init, | ||
| 576 | .wb_fini = &r600_wb_fini, | ||
| 577 | .gart_enable = NULL, | ||
| 578 | .gart_disable = NULL, | ||
| 579 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, | 448 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, |
| 580 | .gart_set_page = &rs600_gart_set_page, | 449 | .gart_set_page = &rs600_gart_set_page, |
| 581 | .cp_init = NULL, | ||
| 582 | .cp_fini = NULL, | ||
| 583 | .cp_disable = NULL, | ||
| 584 | .ring_start = NULL, | ||
| 585 | .ring_test = &r600_ring_test, | 450 | .ring_test = &r600_ring_test, |
| 586 | .ring_ib_execute = &r600_ring_ib_execute, | 451 | .ring_ib_execute = &r600_ring_ib_execute, |
| 587 | .ib_test = &r600_ib_test, | ||
| 588 | .irq_set = &r600_irq_set, | 452 | .irq_set = &r600_irq_set, |
| 589 | .irq_process = &r600_irq_process, | 453 | .irq_process = &r600_irq_process, |
| 590 | .fence_ring_emit = &r600_fence_ring_emit, | 454 | .fence_ring_emit = &r600_fence_ring_emit, |
| @@ -611,30 +475,17 @@ int rv770_resume(struct radeon_device *rdev); | |||
| 611 | int rv770_gpu_reset(struct radeon_device *rdev); | 475 | int rv770_gpu_reset(struct radeon_device *rdev); |
| 612 | 476 | ||
| 613 | static struct radeon_asic rv770_asic = { | 477 | static struct radeon_asic rv770_asic = { |
| 614 | .errata = NULL, | ||
| 615 | .init = &rv770_init, | 478 | .init = &rv770_init, |
| 616 | .fini = &rv770_fini, | 479 | .fini = &rv770_fini, |
| 617 | .suspend = &rv770_suspend, | 480 | .suspend = &rv770_suspend, |
| 618 | .resume = &rv770_resume, | 481 | .resume = &rv770_resume, |
| 619 | .cp_commit = &r600_cp_commit, | 482 | .cp_commit = &r600_cp_commit, |
| 620 | .vram_info = NULL, | ||
| 621 | .gpu_reset = &rv770_gpu_reset, | 483 | .gpu_reset = &rv770_gpu_reset, |
| 622 | .vga_set_state = &r600_vga_set_state, | 484 | .vga_set_state = &r600_vga_set_state, |
| 623 | .mc_init = NULL, | ||
| 624 | .mc_fini = NULL, | ||
| 625 | .wb_init = &r600_wb_init, | ||
| 626 | .wb_fini = &r600_wb_fini, | ||
| 627 | .gart_enable = NULL, | ||
| 628 | .gart_disable = NULL, | ||
| 629 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, | 485 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, |
| 630 | .gart_set_page = &rs600_gart_set_page, | 486 | .gart_set_page = &rs600_gart_set_page, |
| 631 | .cp_init = NULL, | ||
| 632 | .cp_fini = NULL, | ||
| 633 | .cp_disable = NULL, | ||
| 634 | .ring_start = NULL, | ||
| 635 | .ring_test = &r600_ring_test, | 487 | .ring_test = &r600_ring_test, |
| 636 | .ring_ib_execute = &r600_ring_ib_execute, | 488 | .ring_ib_execute = &r600_ring_ib_execute, |
| 637 | .ib_test = &r600_ib_test, | ||
| 638 | .irq_set = &r600_irq_set, | 489 | .irq_set = &r600_irq_set, |
| 639 | .irq_process = &r600_irq_process, | 490 | .irq_process = &r600_irq_process, |
| 640 | .fence_ring_emit = &r600_fence_ring_emit, | 491 | .fence_ring_emit = &r600_fence_ring_emit, |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 96e37a6e7ce4..34a9b9119518 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
| @@ -33,12 +33,50 @@ | |||
| 33 | /* | 33 | /* |
| 34 | * BIOS. | 34 | * BIOS. |
| 35 | */ | 35 | */ |
| 36 | |||
| 37 | /* If you boot an IGP board with a discrete card as the primary, | ||
| 38 | * the IGP rom is not accessible via the rom bar as the IGP rom is | ||
| 39 | * part of the system bios. On boot, the system bios puts a | ||
| 40 | * copy of the igp rom at the start of vram if a discrete card is | ||
| 41 | * present. | ||
| 42 | */ | ||
| 43 | static bool igp_read_bios_from_vram(struct radeon_device *rdev) | ||
| 44 | { | ||
| 45 | uint8_t __iomem *bios; | ||
| 46 | resource_size_t vram_base; | ||
| 47 | resource_size_t size = 256 * 1024; /* ??? */ | ||
| 48 | |||
| 49 | rdev->bios = NULL; | ||
| 50 | vram_base = drm_get_resource_start(rdev->ddev, 0); | ||
| 51 | bios = ioremap(vram_base, size); | ||
| 52 | if (!bios) { | ||
| 53 | DRM_ERROR("Unable to mmap vram\n"); | ||
| 54 | return false; | ||
| 55 | } | ||
| 56 | |||
| 57 | if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) { | ||
| 58 | iounmap(bios); | ||
| 59 | DRM_ERROR("bad rom signature\n"); | ||
| 60 | return false; | ||
| 61 | } | ||
| 62 | rdev->bios = kmalloc(size, GFP_KERNEL); | ||
| 63 | if (rdev->bios == NULL) { | ||
| 64 | iounmap(bios); | ||
| 65 | DRM_ERROR("kmalloc failed\n"); | ||
| 66 | return false; | ||
| 67 | } | ||
| 68 | memcpy(rdev->bios, bios, size); | ||
| 69 | iounmap(bios); | ||
| 70 | return true; | ||
| 71 | } | ||
| 72 | |||
| 36 | static bool radeon_read_bios(struct radeon_device *rdev) | 73 | static bool radeon_read_bios(struct radeon_device *rdev) |
| 37 | { | 74 | { |
| 38 | uint8_t __iomem *bios; | 75 | uint8_t __iomem *bios; |
| 39 | size_t size; | 76 | size_t size; |
| 40 | 77 | ||
| 41 | rdev->bios = NULL; | 78 | rdev->bios = NULL; |
| 79 | /* XXX: some cards may return 0 for rom size? ddx has a workaround */ | ||
| 42 | bios = pci_map_rom(rdev->pdev, &size); | 80 | bios = pci_map_rom(rdev->pdev, &size); |
| 43 | if (!bios) { | 81 | if (!bios) { |
| 44 | return false; | 82 | return false; |
| @@ -341,7 +379,9 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev) | |||
| 341 | 379 | ||
| 342 | static bool radeon_read_disabled_bios(struct radeon_device *rdev) | 380 | static bool radeon_read_disabled_bios(struct radeon_device *rdev) |
| 343 | { | 381 | { |
| 344 | if (rdev->family >= CHIP_RV770) | 382 | if (rdev->flags & RADEON_IS_IGP) |
| 383 | return igp_read_bios_from_vram(rdev); | ||
| 384 | else if (rdev->family >= CHIP_RV770) | ||
| 345 | return r700_read_disabled_bios(rdev); | 385 | return r700_read_disabled_bios(rdev); |
| 346 | else if (rdev->family >= CHIP_R600) | 386 | else if (rdev->family >= CHIP_R600) |
| 347 | return r600_read_disabled_bios(rdev); | 387 | return r600_read_disabled_bios(rdev); |
| @@ -356,7 +396,12 @@ bool radeon_get_bios(struct radeon_device *rdev) | |||
| 356 | bool r; | 396 | bool r; |
| 357 | uint16_t tmp; | 397 | uint16_t tmp; |
| 358 | 398 | ||
| 359 | r = radeon_read_bios(rdev); | 399 | if (rdev->flags & RADEON_IS_IGP) { |
| 400 | r = igp_read_bios_from_vram(rdev); | ||
| 401 | if (r == false) | ||
| 402 | r = radeon_read_bios(rdev); | ||
| 403 | } else | ||
| 404 | r = radeon_read_bios(rdev); | ||
| 360 | if (r == false) { | 405 | if (r == false) { |
| 361 | r = radeon_read_disabled_bios(rdev); | 406 | r = radeon_read_disabled_bios(rdev); |
| 362 | } | 407 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_clocks.c b/drivers/gpu/drm/radeon/radeon_clocks.c index 152eef13197a..f5c32a766b10 100644 --- a/drivers/gpu/drm/radeon/radeon_clocks.c +++ b/drivers/gpu/drm/radeon/radeon_clocks.c | |||
| @@ -411,7 +411,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
| 411 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 411 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
| 412 | R300_PIXCLK_TVO_ALWAYS_ONb | | 412 | R300_PIXCLK_TVO_ALWAYS_ONb | |
| 413 | R300_P2G2CLK_ALWAYS_ONb | | 413 | R300_P2G2CLK_ALWAYS_ONb | |
| 414 | R300_P2G2CLK_ALWAYS_ONb); | 414 | R300_P2G2CLK_DAC_ALWAYS_ONb); |
| 415 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 415 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
| 416 | } else if (rdev->family >= CHIP_RV350) { | 416 | } else if (rdev->family >= CHIP_RV350) { |
| 417 | tmp = RREG32_PLL(R300_SCLK_CNTL2); | 417 | tmp = RREG32_PLL(R300_SCLK_CNTL2); |
| @@ -464,7 +464,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
| 464 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 464 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
| 465 | R300_PIXCLK_TVO_ALWAYS_ONb | | 465 | R300_PIXCLK_TVO_ALWAYS_ONb | |
| 466 | R300_P2G2CLK_ALWAYS_ONb | | 466 | R300_P2G2CLK_ALWAYS_ONb | |
| 467 | R300_P2G2CLK_ALWAYS_ONb); | 467 | R300_P2G2CLK_DAC_ALWAYS_ONb); |
| 468 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 468 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
| 469 | 469 | ||
| 470 | tmp = RREG32_PLL(RADEON_MCLK_MISC); | 470 | tmp = RREG32_PLL(RADEON_MCLK_MISC); |
| @@ -654,7 +654,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
| 654 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 654 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
| 655 | R300_PIXCLK_TVO_ALWAYS_ONb | | 655 | R300_PIXCLK_TVO_ALWAYS_ONb | |
| 656 | R300_P2G2CLK_ALWAYS_ONb | | 656 | R300_P2G2CLK_ALWAYS_ONb | |
| 657 | R300_P2G2CLK_ALWAYS_ONb | | 657 | R300_P2G2CLK_DAC_ALWAYS_ONb | |
| 658 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); | 658 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); |
| 659 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 659 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
| 660 | } else if (rdev->family >= CHIP_RV350) { | 660 | } else if (rdev->family >= CHIP_RV350) { |
| @@ -705,7 +705,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
| 705 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 705 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
| 706 | R300_PIXCLK_TVO_ALWAYS_ONb | | 706 | R300_PIXCLK_TVO_ALWAYS_ONb | |
| 707 | R300_P2G2CLK_ALWAYS_ONb | | 707 | R300_P2G2CLK_ALWAYS_ONb | |
| 708 | R300_P2G2CLK_ALWAYS_ONb | | 708 | R300_P2G2CLK_DAC_ALWAYS_ONb | |
| 709 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); | 709 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); |
| 710 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 710 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
| 711 | } else { | 711 | } else { |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index ec835d56d30a..3d667031de6e 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -322,10 +322,6 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
| 322 | case CHIP_RV380: | 322 | case CHIP_RV380: |
| 323 | rdev->asic = &r300_asic; | 323 | rdev->asic = &r300_asic; |
| 324 | if (rdev->flags & RADEON_IS_PCIE) { | 324 | if (rdev->flags & RADEON_IS_PCIE) { |
| 325 | rdev->asic->gart_init = &rv370_pcie_gart_init; | ||
| 326 | rdev->asic->gart_fini = &rv370_pcie_gart_fini; | ||
| 327 | rdev->asic->gart_enable = &rv370_pcie_gart_enable; | ||
| 328 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
| 329 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | 325 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; |
| 330 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | 326 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; |
| 331 | } | 327 | } |
| @@ -485,7 +481,6 @@ void radeon_combios_fini(struct radeon_device *rdev) | |||
| 485 | static unsigned int radeon_vga_set_decode(void *cookie, bool state) | 481 | static unsigned int radeon_vga_set_decode(void *cookie, bool state) |
| 486 | { | 482 | { |
| 487 | struct radeon_device *rdev = cookie; | 483 | struct radeon_device *rdev = cookie; |
| 488 | |||
| 489 | radeon_vga_set_state(rdev, state); | 484 | radeon_vga_set_state(rdev, state); |
| 490 | if (state) | 485 | if (state) |
| 491 | return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | | 486 | return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | |
| @@ -493,6 +488,29 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state) | |||
| 493 | else | 488 | else |
| 494 | return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; | 489 | return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; |
| 495 | } | 490 | } |
| 491 | |||
| 492 | void radeon_agp_disable(struct radeon_device *rdev) | ||
| 493 | { | ||
| 494 | rdev->flags &= ~RADEON_IS_AGP; | ||
| 495 | if (rdev->family >= CHIP_R600) { | ||
| 496 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
| 497 | rdev->flags |= RADEON_IS_PCIE; | ||
| 498 | } else if (rdev->family >= CHIP_RV515 || | ||
| 499 | rdev->family == CHIP_RV380 || | ||
| 500 | rdev->family == CHIP_RV410 || | ||
| 501 | rdev->family == CHIP_R423) { | ||
| 502 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
| 503 | rdev->flags |= RADEON_IS_PCIE; | ||
| 504 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
| 505 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
| 506 | } else { | ||
| 507 | DRM_INFO("Forcing AGP to PCI mode\n"); | ||
| 508 | rdev->flags |= RADEON_IS_PCI; | ||
| 509 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; | ||
| 510 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; | ||
| 511 | } | ||
| 512 | } | ||
| 513 | |||
| 496 | /* | 514 | /* |
| 497 | * Radeon device. | 515 | * Radeon device. |
| 498 | */ | 516 | */ |
| @@ -531,32 +549,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 531 | } | 549 | } |
| 532 | 550 | ||
| 533 | if (radeon_agpmode == -1) { | 551 | if (radeon_agpmode == -1) { |
| 534 | rdev->flags &= ~RADEON_IS_AGP; | 552 | radeon_agp_disable(rdev); |
| 535 | if (rdev->family >= CHIP_R600) { | ||
| 536 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
| 537 | rdev->flags |= RADEON_IS_PCIE; | ||
| 538 | } else if (rdev->family >= CHIP_RV515 || | ||
| 539 | rdev->family == CHIP_RV380 || | ||
| 540 | rdev->family == CHIP_RV410 || | ||
| 541 | rdev->family == CHIP_R423) { | ||
| 542 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
| 543 | rdev->flags |= RADEON_IS_PCIE; | ||
| 544 | rdev->asic->gart_init = &rv370_pcie_gart_init; | ||
| 545 | rdev->asic->gart_fini = &rv370_pcie_gart_fini; | ||
| 546 | rdev->asic->gart_enable = &rv370_pcie_gart_enable; | ||
| 547 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
| 548 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
| 549 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
| 550 | } else { | ||
| 551 | DRM_INFO("Forcing AGP to PCI mode\n"); | ||
| 552 | rdev->flags |= RADEON_IS_PCI; | ||
| 553 | rdev->asic->gart_init = &r100_pci_gart_init; | ||
| 554 | rdev->asic->gart_fini = &r100_pci_gart_fini; | ||
| 555 | rdev->asic->gart_enable = &r100_pci_gart_enable; | ||
| 556 | rdev->asic->gart_disable = &r100_pci_gart_disable; | ||
| 557 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; | ||
| 558 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; | ||
| 559 | } | ||
| 560 | } | 553 | } |
| 561 | 554 | ||
| 562 | /* set DMA mask + need_dma32 flags. | 555 | /* set DMA mask + need_dma32 flags. |
| @@ -588,111 +581,27 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 588 | DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base); | 581 | DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base); |
| 589 | DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); | 582 | DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); |
| 590 | 583 | ||
| 591 | rdev->new_init_path = false; | ||
| 592 | r = radeon_init(rdev); | ||
| 593 | if (r) { | ||
| 594 | return r; | ||
| 595 | } | ||
| 596 | |||
| 597 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ | 584 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ |
| 598 | r = vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); | 585 | r = vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); |
| 599 | if (r) { | 586 | if (r) { |
| 600 | return -EINVAL; | 587 | return -EINVAL; |
| 601 | } | 588 | } |
| 602 | 589 | ||
| 603 | if (!rdev->new_init_path) { | 590 | r = radeon_init(rdev); |
| 604 | /* Setup errata flags */ | 591 | if (r) |
| 605 | radeon_errata(rdev); | 592 | return r; |
| 606 | /* Initialize scratch registers */ | ||
| 607 | radeon_scratch_init(rdev); | ||
| 608 | /* Initialize surface registers */ | ||
| 609 | radeon_surface_init(rdev); | ||
| 610 | |||
| 611 | /* BIOS*/ | ||
| 612 | if (!radeon_get_bios(rdev)) { | ||
| 613 | if (ASIC_IS_AVIVO(rdev)) | ||
| 614 | return -EINVAL; | ||
| 615 | } | ||
| 616 | if (rdev->is_atom_bios) { | ||
| 617 | r = radeon_atombios_init(rdev); | ||
| 618 | if (r) { | ||
| 619 | return r; | ||
| 620 | } | ||
| 621 | } else { | ||
| 622 | r = radeon_combios_init(rdev); | ||
| 623 | if (r) { | ||
| 624 | return r; | ||
| 625 | } | ||
| 626 | } | ||
| 627 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 628 | if (radeon_gpu_reset(rdev)) { | ||
| 629 | /* FIXME: what do we want to do here ? */ | ||
| 630 | } | ||
| 631 | /* check if cards are posted or not */ | ||
| 632 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
| 633 | DRM_INFO("GPU not posted. posting now...\n"); | ||
| 634 | if (rdev->is_atom_bios) { | ||
| 635 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 636 | } else { | ||
| 637 | radeon_combios_asic_init(rdev->ddev); | ||
| 638 | } | ||
| 639 | } | ||
| 640 | /* Get clock & vram information */ | ||
| 641 | radeon_get_clock_info(rdev->ddev); | ||
| 642 | radeon_vram_info(rdev); | ||
| 643 | /* Initialize clocks */ | ||
| 644 | r = radeon_clocks_init(rdev); | ||
| 645 | if (r) { | ||
| 646 | return r; | ||
| 647 | } | ||
| 648 | 593 | ||
| 649 | /* Initialize memory controller (also test AGP) */ | 594 | if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) { |
| 650 | r = radeon_mc_init(rdev); | 595 | /* Acceleration not working on AGP card try again |
| 651 | if (r) { | 596 | * with fallback to PCI or PCIE GART |
| 652 | return r; | 597 | */ |
| 653 | } | 598 | radeon_gpu_reset(rdev); |
| 654 | /* Fence driver */ | 599 | radeon_fini(rdev); |
| 655 | r = radeon_fence_driver_init(rdev); | 600 | radeon_agp_disable(rdev); |
| 656 | if (r) { | 601 | r = radeon_init(rdev); |
| 657 | return r; | ||
| 658 | } | ||
| 659 | r = radeon_irq_kms_init(rdev); | ||
| 660 | if (r) { | ||
| 661 | return r; | ||
| 662 | } | ||
| 663 | /* Memory manager */ | ||
| 664 | r = radeon_object_init(rdev); | ||
| 665 | if (r) { | ||
| 666 | return r; | ||
| 667 | } | ||
| 668 | r = radeon_gpu_gart_init(rdev); | ||
| 669 | if (r) | 602 | if (r) |
| 670 | return r; | 603 | return r; |
| 671 | /* Initialize GART (initialize after TTM so we can allocate | ||
| 672 | * memory through TTM but finalize after TTM) */ | ||
| 673 | r = radeon_gart_enable(rdev); | ||
| 674 | if (r) | ||
| 675 | return 0; | ||
| 676 | r = radeon_gem_init(rdev); | ||
| 677 | if (r) | ||
| 678 | return 0; | ||
| 679 | |||
| 680 | /* 1M ring buffer */ | ||
| 681 | r = radeon_cp_init(rdev, 1024 * 1024); | ||
| 682 | if (r) | ||
| 683 | return 0; | ||
| 684 | r = radeon_wb_init(rdev); | ||
| 685 | if (r) | ||
| 686 | DRM_ERROR("radeon: failled initializing WB (%d).\n", r); | ||
| 687 | r = radeon_ib_pool_init(rdev); | ||
| 688 | if (r) | ||
| 689 | return 0; | ||
| 690 | r = radeon_ib_test(rdev); | ||
| 691 | if (r) | ||
| 692 | return 0; | ||
| 693 | rdev->accel_working = true; | ||
| 694 | } | 604 | } |
| 695 | DRM_INFO("radeon: kernel modesetting successfully initialized.\n"); | ||
| 696 | if (radeon_testing) { | 605 | if (radeon_testing) { |
| 697 | radeon_test_moves(rdev); | 606 | radeon_test_moves(rdev); |
| 698 | } | 607 | } |
| @@ -706,32 +615,8 @@ void radeon_device_fini(struct radeon_device *rdev) | |||
| 706 | { | 615 | { |
| 707 | DRM_INFO("radeon: finishing device.\n"); | 616 | DRM_INFO("radeon: finishing device.\n"); |
| 708 | rdev->shutdown = true; | 617 | rdev->shutdown = true; |
| 709 | /* Order matter so becarefull if you rearrange anythings */ | 618 | radeon_fini(rdev); |
| 710 | if (!rdev->new_init_path) { | 619 | vga_client_register(rdev->pdev, NULL, NULL, NULL); |
| 711 | radeon_ib_pool_fini(rdev); | ||
| 712 | radeon_cp_fini(rdev); | ||
| 713 | radeon_wb_fini(rdev); | ||
| 714 | radeon_gpu_gart_fini(rdev); | ||
| 715 | radeon_gem_fini(rdev); | ||
| 716 | radeon_mc_fini(rdev); | ||
| 717 | #if __OS_HAS_AGP | ||
| 718 | radeon_agp_fini(rdev); | ||
| 719 | #endif | ||
| 720 | radeon_irq_kms_fini(rdev); | ||
| 721 | vga_client_register(rdev->pdev, NULL, NULL, NULL); | ||
| 722 | radeon_fence_driver_fini(rdev); | ||
| 723 | radeon_clocks_fini(rdev); | ||
| 724 | radeon_object_fini(rdev); | ||
| 725 | if (rdev->is_atom_bios) { | ||
| 726 | radeon_atombios_fini(rdev); | ||
| 727 | } else { | ||
| 728 | radeon_combios_fini(rdev); | ||
| 729 | } | ||
| 730 | kfree(rdev->bios); | ||
| 731 | rdev->bios = NULL; | ||
| 732 | } else { | ||
| 733 | radeon_fini(rdev); | ||
| 734 | } | ||
| 735 | iounmap(rdev->rmmio); | 620 | iounmap(rdev->rmmio); |
| 736 | rdev->rmmio = NULL; | 621 | rdev->rmmio = NULL; |
| 737 | } | 622 | } |
| @@ -771,14 +656,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
| 771 | 656 | ||
| 772 | radeon_save_bios_scratch_regs(rdev); | 657 | radeon_save_bios_scratch_regs(rdev); |
| 773 | 658 | ||
| 774 | if (!rdev->new_init_path) { | 659 | radeon_suspend(rdev); |
| 775 | radeon_cp_disable(rdev); | ||
| 776 | radeon_gart_disable(rdev); | ||
| 777 | rdev->irq.sw_int = false; | ||
| 778 | radeon_irq_set(rdev); | ||
| 779 | } else { | ||
| 780 | radeon_suspend(rdev); | ||
| 781 | } | ||
| 782 | /* evict remaining vram memory */ | 660 | /* evict remaining vram memory */ |
| 783 | radeon_object_evict_vram(rdev); | 661 | radeon_object_evict_vram(rdev); |
| 784 | 662 | ||
| @@ -797,7 +675,6 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
| 797 | int radeon_resume_kms(struct drm_device *dev) | 675 | int radeon_resume_kms(struct drm_device *dev) |
| 798 | { | 676 | { |
| 799 | struct radeon_device *rdev = dev->dev_private; | 677 | struct radeon_device *rdev = dev->dev_private; |
| 800 | int r; | ||
| 801 | 678 | ||
| 802 | acquire_console_sem(); | 679 | acquire_console_sem(); |
| 803 | pci_set_power_state(dev->pdev, PCI_D0); | 680 | pci_set_power_state(dev->pdev, PCI_D0); |
| @@ -807,43 +684,7 @@ int radeon_resume_kms(struct drm_device *dev) | |||
| 807 | return -1; | 684 | return -1; |
| 808 | } | 685 | } |
| 809 | pci_set_master(dev->pdev); | 686 | pci_set_master(dev->pdev); |
| 810 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 687 | radeon_resume(rdev); |
| 811 | if (!rdev->new_init_path) { | ||
| 812 | if (radeon_gpu_reset(rdev)) { | ||
| 813 | /* FIXME: what do we want to do here ? */ | ||
| 814 | } | ||
| 815 | /* post card */ | ||
| 816 | if (rdev->is_atom_bios) { | ||
| 817 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 818 | } else { | ||
| 819 | radeon_combios_asic_init(rdev->ddev); | ||
| 820 | } | ||
| 821 | /* Initialize clocks */ | ||
| 822 | r = radeon_clocks_init(rdev); | ||
| 823 | if (r) { | ||
| 824 | release_console_sem(); | ||
| 825 | return r; | ||
| 826 | } | ||
| 827 | /* Enable IRQ */ | ||
| 828 | rdev->irq.sw_int = true; | ||
| 829 | radeon_irq_set(rdev); | ||
| 830 | /* Initialize GPU Memory Controller */ | ||
| 831 | r = radeon_mc_init(rdev); | ||
| 832 | if (r) { | ||
| 833 | goto out; | ||
| 834 | } | ||
| 835 | r = radeon_gart_enable(rdev); | ||
| 836 | if (r) { | ||
| 837 | goto out; | ||
| 838 | } | ||
| 839 | r = radeon_cp_init(rdev, rdev->cp.ring_size); | ||
| 840 | if (r) { | ||
| 841 | goto out; | ||
| 842 | } | ||
| 843 | } else { | ||
| 844 | radeon_resume(rdev); | ||
| 845 | } | ||
| 846 | out: | ||
| 847 | radeon_restore_bios_scratch_regs(rdev); | 688 | radeon_restore_bios_scratch_regs(rdev); |
| 848 | fb_set_suspend(rdev->fbdev_info, 0); | 689 | fb_set_suspend(rdev->fbdev_info, 0); |
| 849 | release_console_sem(); | 690 | release_console_sem(); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 5d8141b13765..3655d91993a6 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -106,24 +106,33 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc) | |||
| 106 | legacy_crtc_load_lut(crtc); | 106 | legacy_crtc_load_lut(crtc); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | /** Sets the color ramps on behalf of RandR */ | 109 | /** Sets the color ramps on behalf of fbcon */ |
| 110 | void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 110 | void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
| 111 | u16 blue, int regno) | 111 | u16 blue, int regno) |
| 112 | { | 112 | { |
| 113 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 113 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
| 114 | 114 | ||
| 115 | if (regno == 0) | ||
| 116 | DRM_DEBUG("gamma set %d\n", radeon_crtc->crtc_id); | ||
| 117 | radeon_crtc->lut_r[regno] = red >> 6; | 115 | radeon_crtc->lut_r[regno] = red >> 6; |
| 118 | radeon_crtc->lut_g[regno] = green >> 6; | 116 | radeon_crtc->lut_g[regno] = green >> 6; |
| 119 | radeon_crtc->lut_b[regno] = blue >> 6; | 117 | radeon_crtc->lut_b[regno] = blue >> 6; |
| 120 | } | 118 | } |
| 121 | 119 | ||
| 120 | /** Gets the color ramps on behalf of fbcon */ | ||
| 121 | void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
| 122 | u16 *blue, int regno) | ||
| 123 | { | ||
| 124 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
| 125 | |||
| 126 | *red = radeon_crtc->lut_r[regno] << 6; | ||
| 127 | *green = radeon_crtc->lut_g[regno] << 6; | ||
| 128 | *blue = radeon_crtc->lut_b[regno] << 6; | ||
| 129 | } | ||
| 130 | |||
| 122 | static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, | 131 | static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
| 123 | u16 *blue, uint32_t size) | 132 | u16 *blue, uint32_t size) |
| 124 | { | 133 | { |
| 125 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 134 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
| 126 | int i, j; | 135 | int i; |
| 127 | 136 | ||
| 128 | if (size != 256) { | 137 | if (size != 256) { |
| 129 | return; | 138 | return; |
| @@ -132,23 +141,11 @@ static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, | |||
| 132 | return; | 141 | return; |
| 133 | } | 142 | } |
| 134 | 143 | ||
| 135 | if (crtc->fb->depth == 16) { | 144 | /* userspace palettes are always correct as is */ |
| 136 | for (i = 0; i < 64; i++) { | 145 | for (i = 0; i < 256; i++) { |
| 137 | if (i <= 31) { | 146 | radeon_crtc->lut_r[i] = red[i] >> 6; |
| 138 | for (j = 0; j < 8; j++) { | 147 | radeon_crtc->lut_g[i] = green[i] >> 6; |
| 139 | radeon_crtc->lut_r[i * 8 + j] = red[i] >> 6; | 148 | radeon_crtc->lut_b[i] = blue[i] >> 6; |
| 140 | radeon_crtc->lut_b[i * 8 + j] = blue[i] >> 6; | ||
| 141 | } | ||
| 142 | } | ||
| 143 | for (j = 0; j < 4; j++) | ||
| 144 | radeon_crtc->lut_g[i * 4 + j] = green[i] >> 6; | ||
| 145 | } | ||
| 146 | } else { | ||
| 147 | for (i = 0; i < 256; i++) { | ||
| 148 | radeon_crtc->lut_r[i] = red[i] >> 6; | ||
| 149 | radeon_crtc->lut_g[i] = green[i] >> 6; | ||
| 150 | radeon_crtc->lut_b[i] = blue[i] >> 6; | ||
| 151 | } | ||
| 152 | } | 149 | } |
| 153 | 150 | ||
| 154 | radeon_crtc_load_lut(crtc); | 151 | radeon_crtc_load_lut(crtc); |
| @@ -724,7 +721,11 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
| 724 | if (ret) { | 721 | if (ret) { |
| 725 | return ret; | 722 | return ret; |
| 726 | } | 723 | } |
| 727 | /* allocate crtcs - TODO single crtc */ | 724 | |
| 725 | if (rdev->flags & RADEON_SINGLE_CRTC) | ||
| 726 | num_crtc = 1; | ||
| 727 | |||
| 728 | /* allocate crtcs */ | ||
| 728 | for (i = 0; i < num_crtc; i++) { | 729 | for (i = 0; i < num_crtc; i++) { |
| 729 | radeon_crtc_init(rdev->ddev, i); | 730 | radeon_crtc_init(rdev->ddev, i); |
| 730 | } | 731 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 621646752cd2..a65ab1a0dad2 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -1345,6 +1345,7 @@ radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder) | |||
| 1345 | void | 1345 | void |
| 1346 | radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t supported_device) | 1346 | radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t supported_device) |
| 1347 | { | 1347 | { |
| 1348 | struct radeon_device *rdev = dev->dev_private; | ||
| 1348 | struct drm_encoder *encoder; | 1349 | struct drm_encoder *encoder; |
| 1349 | struct radeon_encoder *radeon_encoder; | 1350 | struct radeon_encoder *radeon_encoder; |
| 1350 | 1351 | ||
| @@ -1364,7 +1365,10 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su | |||
| 1364 | return; | 1365 | return; |
| 1365 | 1366 | ||
| 1366 | encoder = &radeon_encoder->base; | 1367 | encoder = &radeon_encoder->base; |
| 1367 | encoder->possible_crtcs = 0x3; | 1368 | if (rdev->flags & RADEON_SINGLE_CRTC) |
| 1369 | encoder->possible_crtcs = 0x1; | ||
| 1370 | else | ||
| 1371 | encoder->possible_crtcs = 0x3; | ||
| 1368 | encoder->possible_clones = 0; | 1372 | encoder->possible_clones = 0; |
| 1369 | 1373 | ||
| 1370 | radeon_encoder->enc_priv = NULL; | 1374 | radeon_encoder->enc_priv = NULL; |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 1ba704eedefb..b38c4c8e2c61 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
| @@ -55,6 +55,7 @@ static struct fb_ops radeonfb_ops = { | |||
| 55 | .fb_imageblit = cfb_imageblit, | 55 | .fb_imageblit = cfb_imageblit, |
| 56 | .fb_pan_display = drm_fb_helper_pan_display, | 56 | .fb_pan_display = drm_fb_helper_pan_display, |
| 57 | .fb_blank = drm_fb_helper_blank, | 57 | .fb_blank = drm_fb_helper_blank, |
| 58 | .fb_setcmap = drm_fb_helper_setcmap, | ||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | /** | 61 | /** |
| @@ -123,6 +124,7 @@ static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bo | |||
| 123 | 124 | ||
| 124 | static struct drm_fb_helper_funcs radeon_fb_helper_funcs = { | 125 | static struct drm_fb_helper_funcs radeon_fb_helper_funcs = { |
| 125 | .gamma_set = radeon_crtc_fb_gamma_set, | 126 | .gamma_set = radeon_crtc_fb_gamma_set, |
| 127 | .gamma_get = radeon_crtc_fb_gamma_get, | ||
| 126 | }; | 128 | }; |
| 127 | 129 | ||
| 128 | int radeonfb_create(struct drm_device *dev, | 130 | int radeonfb_create(struct drm_device *dev, |
| @@ -146,9 +148,15 @@ int radeonfb_create(struct drm_device *dev, | |||
| 146 | unsigned long tmp; | 148 | unsigned long tmp; |
| 147 | bool fb_tiled = false; /* useful for testing */ | 149 | bool fb_tiled = false; /* useful for testing */ |
| 148 | u32 tiling_flags = 0; | 150 | u32 tiling_flags = 0; |
| 151 | int crtc_count; | ||
| 149 | 152 | ||
| 150 | mode_cmd.width = surface_width; | 153 | mode_cmd.width = surface_width; |
| 151 | mode_cmd.height = surface_height; | 154 | mode_cmd.height = surface_height; |
| 155 | |||
| 156 | /* avivo can't scanout real 24bpp */ | ||
| 157 | if ((surface_bpp == 24) && ASIC_IS_AVIVO(rdev)) | ||
| 158 | surface_bpp = 32; | ||
| 159 | |||
| 152 | mode_cmd.bpp = surface_bpp; | 160 | mode_cmd.bpp = surface_bpp; |
| 153 | /* need to align pitch with crtc limits */ | 161 | /* need to align pitch with crtc limits */ |
| 154 | mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8); | 162 | mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8); |
| @@ -217,7 +225,11 @@ int radeonfb_create(struct drm_device *dev, | |||
| 217 | rfbdev = info->par; | 225 | rfbdev = info->par; |
| 218 | rfbdev->helper.funcs = &radeon_fb_helper_funcs; | 226 | rfbdev->helper.funcs = &radeon_fb_helper_funcs; |
| 219 | rfbdev->helper.dev = dev; | 227 | rfbdev->helper.dev = dev; |
| 220 | ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, 2, | 228 | if (rdev->flags & RADEON_SINGLE_CRTC) |
| 229 | crtc_count = 1; | ||
| 230 | else | ||
| 231 | crtc_count = 2; | ||
| 232 | ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, crtc_count, | ||
| 221 | RADEONFB_CONN_LIMIT); | 233 | RADEONFB_CONN_LIMIT); |
| 222 | if (ret) | 234 | if (ret) |
| 223 | goto out_unref; | 235 | goto out_unref; |
| @@ -234,7 +246,7 @@ int radeonfb_create(struct drm_device *dev, | |||
| 234 | 246 | ||
| 235 | strcpy(info->fix.id, "radeondrmfb"); | 247 | strcpy(info->fix.id, "radeondrmfb"); |
| 236 | 248 | ||
| 237 | drm_fb_helper_fill_fix(info, fb->pitch); | 249 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); |
| 238 | 250 | ||
| 239 | info->flags = FBINFO_DEFAULT; | 251 | info->flags = FBINFO_DEFAULT; |
| 240 | info->fbops = &radeonfb_ops; | 252 | info->fbops = &radeonfb_ops; |
| @@ -309,7 +321,7 @@ int radeon_parse_options(char *options) | |||
| 309 | 321 | ||
| 310 | int radeonfb_probe(struct drm_device *dev) | 322 | int radeonfb_probe(struct drm_device *dev) |
| 311 | { | 323 | { |
| 312 | return drm_fb_helper_single_fb_probe(dev, &radeonfb_create); | 324 | return drm_fb_helper_single_fb_probe(dev, 32, &radeonfb_create); |
| 313 | } | 325 | } |
| 314 | 326 | ||
| 315 | int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb) | 327 | int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb) |
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index 1841145a7c4f..8e0a8759e428 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | |||
| @@ -83,8 +83,12 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev) | |||
| 83 | int radeon_irq_kms_init(struct radeon_device *rdev) | 83 | int radeon_irq_kms_init(struct radeon_device *rdev) |
| 84 | { | 84 | { |
| 85 | int r = 0; | 85 | int r = 0; |
| 86 | int num_crtc = 2; | ||
| 86 | 87 | ||
| 87 | r = drm_vblank_init(rdev->ddev, 2); | 88 | if (rdev->flags & RADEON_SINGLE_CRTC) |
| 89 | num_crtc = 1; | ||
| 90 | |||
| 91 | r = drm_vblank_init(rdev->ddev, num_crtc); | ||
| 88 | if (r) { | 92 | if (r) { |
| 89 | return r; | 93 | return r; |
| 90 | } | 94 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 2b997a15fb1f..36410f85d705 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
| @@ -1053,6 +1053,7 @@ static const struct drm_crtc_helper_funcs legacy_helper_funcs = { | |||
| 1053 | .mode_set_base = radeon_crtc_set_base, | 1053 | .mode_set_base = radeon_crtc_set_base, |
| 1054 | .prepare = radeon_crtc_prepare, | 1054 | .prepare = radeon_crtc_prepare, |
| 1055 | .commit = radeon_crtc_commit, | 1055 | .commit = radeon_crtc_commit, |
| 1056 | .load_lut = radeon_crtc_load_lut, | ||
| 1056 | }; | 1057 | }; |
| 1057 | 1058 | ||
| 1058 | 1059 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index b1547f700d73..6ceb958fd194 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -881,7 +881,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
| 881 | R420_TV_DAC_DACADJ_MASK | | 881 | R420_TV_DAC_DACADJ_MASK | |
| 882 | R420_TV_DAC_RDACPD | | 882 | R420_TV_DAC_RDACPD | |
| 883 | R420_TV_DAC_GDACPD | | 883 | R420_TV_DAC_GDACPD | |
| 884 | R420_TV_DAC_GDACPD | | 884 | R420_TV_DAC_BDACPD | |
| 885 | R420_TV_DAC_TVENABLE); | 885 | R420_TV_DAC_TVENABLE); |
| 886 | } else { | 886 | } else { |
| 887 | tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK | | 887 | tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK | |
| @@ -889,7 +889,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
| 889 | RADEON_TV_DAC_DACADJ_MASK | | 889 | RADEON_TV_DAC_DACADJ_MASK | |
| 890 | RADEON_TV_DAC_RDACPD | | 890 | RADEON_TV_DAC_RDACPD | |
| 891 | RADEON_TV_DAC_GDACPD | | 891 | RADEON_TV_DAC_GDACPD | |
| 892 | RADEON_TV_DAC_GDACPD); | 892 | RADEON_TV_DAC_BDACPD); |
| 893 | } | 893 | } |
| 894 | 894 | ||
| 895 | /* FIXME TV */ | 895 | /* FIXME TV */ |
| @@ -1318,7 +1318,10 @@ radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t | |||
| 1318 | return; | 1318 | return; |
| 1319 | 1319 | ||
| 1320 | encoder = &radeon_encoder->base; | 1320 | encoder = &radeon_encoder->base; |
| 1321 | encoder->possible_crtcs = 0x3; | 1321 | if (rdev->flags & RADEON_SINGLE_CRTC) |
| 1322 | encoder->possible_crtcs = 0x1; | ||
| 1323 | else | ||
| 1324 | encoder->possible_crtcs = 0x3; | ||
| 1322 | encoder->possible_clones = 0; | 1325 | encoder->possible_clones = 0; |
| 1323 | 1326 | ||
| 1324 | radeon_encoder->enc_priv = NULL; | 1327 | radeon_encoder->enc_priv = NULL; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 570a58729daf..e61226817ccf 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -407,6 +407,8 @@ extern void | |||
| 407 | radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on); | 407 | radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on); |
| 408 | extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 408 | extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
| 409 | u16 blue, int regno); | 409 | u16 blue, int regno); |
| 410 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
| 411 | u16 *blue, int regno); | ||
| 410 | struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev, | 412 | struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev, |
| 411 | struct drm_mode_fb_cmd *mode_cmd, | 413 | struct drm_mode_fb_cmd *mode_cmd, |
| 412 | struct drm_gem_object *obj); | 414 | struct drm_gem_object *obj); |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 73af463b7a59..1f056dadc5c2 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -400,11 +400,9 @@ void radeon_object_list_add_object(struct radeon_object_list *lobj, | |||
| 400 | int radeon_object_list_reserve(struct list_head *head) | 400 | int radeon_object_list_reserve(struct list_head *head) |
| 401 | { | 401 | { |
| 402 | struct radeon_object_list *lobj; | 402 | struct radeon_object_list *lobj; |
| 403 | struct list_head *i; | ||
| 404 | int r; | 403 | int r; |
| 405 | 404 | ||
| 406 | list_for_each(i, head) { | 405 | list_for_each_entry(lobj, head, list){ |
| 407 | lobj = list_entry(i, struct radeon_object_list, list); | ||
| 408 | if (!lobj->robj->pin_count) { | 406 | if (!lobj->robj->pin_count) { |
| 409 | r = radeon_object_reserve(lobj->robj, true); | 407 | r = radeon_object_reserve(lobj->robj, true); |
| 410 | if (unlikely(r != 0)) { | 408 | if (unlikely(r != 0)) { |
| @@ -420,13 +418,10 @@ int radeon_object_list_reserve(struct list_head *head) | |||
| 420 | void radeon_object_list_unreserve(struct list_head *head) | 418 | void radeon_object_list_unreserve(struct list_head *head) |
| 421 | { | 419 | { |
| 422 | struct radeon_object_list *lobj; | 420 | struct radeon_object_list *lobj; |
| 423 | struct list_head *i; | ||
| 424 | 421 | ||
| 425 | list_for_each(i, head) { | 422 | list_for_each_entry(lobj, head, list) { |
| 426 | lobj = list_entry(i, struct radeon_object_list, list); | ||
| 427 | if (!lobj->robj->pin_count) { | 423 | if (!lobj->robj->pin_count) { |
| 428 | radeon_object_unreserve(lobj->robj); | 424 | radeon_object_unreserve(lobj->robj); |
| 429 | } else { | ||
| 430 | } | 425 | } |
| 431 | } | 426 | } |
| 432 | } | 427 | } |
| @@ -436,7 +431,6 @@ int radeon_object_list_validate(struct list_head *head, void *fence) | |||
| 436 | struct radeon_object_list *lobj; | 431 | struct radeon_object_list *lobj; |
| 437 | struct radeon_object *robj; | 432 | struct radeon_object *robj; |
| 438 | struct radeon_fence *old_fence = NULL; | 433 | struct radeon_fence *old_fence = NULL; |
| 439 | struct list_head *i; | ||
| 440 | int r; | 434 | int r; |
| 441 | 435 | ||
| 442 | r = radeon_object_list_reserve(head); | 436 | r = radeon_object_list_reserve(head); |
| @@ -444,8 +438,7 @@ int radeon_object_list_validate(struct list_head *head, void *fence) | |||
| 444 | radeon_object_list_unreserve(head); | 438 | radeon_object_list_unreserve(head); |
| 445 | return r; | 439 | return r; |
| 446 | } | 440 | } |
| 447 | list_for_each(i, head) { | 441 | list_for_each_entry(lobj, head, list) { |
| 448 | lobj = list_entry(i, struct radeon_object_list, list); | ||
| 449 | robj = lobj->robj; | 442 | robj = lobj->robj; |
| 450 | if (!robj->pin_count) { | 443 | if (!robj->pin_count) { |
| 451 | if (lobj->wdomain) { | 444 | if (lobj->wdomain) { |
| @@ -482,10 +475,8 @@ void radeon_object_list_unvalidate(struct list_head *head) | |||
| 482 | { | 475 | { |
| 483 | struct radeon_object_list *lobj; | 476 | struct radeon_object_list *lobj; |
| 484 | struct radeon_fence *old_fence = NULL; | 477 | struct radeon_fence *old_fence = NULL; |
| 485 | struct list_head *i; | ||
| 486 | 478 | ||
| 487 | list_for_each(i, head) { | 479 | list_for_each_entry(lobj, head, list) { |
| 488 | lobj = list_entry(i, struct radeon_object_list, list); | ||
| 489 | old_fence = (struct radeon_fence *)lobj->robj->tobj.sync_obj; | 480 | old_fence = (struct radeon_fence *)lobj->robj->tobj.sync_obj; |
| 490 | lobj->robj->tobj.sync_obj = NULL; | 481 | lobj->robj->tobj.sync_obj = NULL; |
| 491 | if (old_fence) { | 482 | if (old_fence) { |
diff --git a/drivers/gpu/drm/radeon/rs100d.h b/drivers/gpu/drm/radeon/rs100d.h new file mode 100644 index 000000000000..48a913a06cfd --- /dev/null +++ b/drivers/gpu/drm/radeon/rs100d.h | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RS100D_H__ | ||
| 29 | #define __RS100D_H__ | ||
| 30 | |||
| 31 | /* Registers */ | ||
| 32 | #define R_00015C_NB_TOM 0x00015C | ||
| 33 | #define S_00015C_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 34 | #define G_00015C_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 35 | #define C_00015C_MC_FB_START 0xFFFF0000 | ||
| 36 | #define S_00015C_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 37 | #define G_00015C_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 38 | #define C_00015C_MC_FB_TOP 0x0000FFFF | ||
| 39 | |||
| 40 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index a3fbdad938c7..a769c296f6a6 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -27,27 +27,12 @@ | |||
| 27 | */ | 27 | */ |
| 28 | #include <linux/seq_file.h> | 28 | #include <linux/seq_file.h> |
| 29 | #include <drm/drmP.h> | 29 | #include <drm/drmP.h> |
| 30 | #include "radeon_reg.h" | ||
| 31 | #include "radeon.h" | 30 | #include "radeon.h" |
| 31 | #include "rs400d.h" | ||
| 32 | 32 | ||
| 33 | /* rs400,rs480 depends on : */ | 33 | /* This files gather functions specifics to : rs400,rs480 */ |
| 34 | void r100_hdp_reset(struct radeon_device *rdev); | 34 | static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev); |
| 35 | void r100_mc_disable_clients(struct radeon_device *rdev); | ||
| 36 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 37 | void r420_pipes_init(struct radeon_device *rdev); | ||
| 38 | 35 | ||
| 39 | /* This files gather functions specifics to : | ||
| 40 | * rs400,rs480 | ||
| 41 | * | ||
| 42 | * Some of these functions might be used by newer ASICs. | ||
| 43 | */ | ||
| 44 | void rs400_gpu_init(struct radeon_device *rdev); | ||
| 45 | int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev); | ||
| 46 | |||
| 47 | |||
| 48 | /* | ||
| 49 | * GART functions. | ||
| 50 | */ | ||
| 51 | void rs400_gart_adjust_size(struct radeon_device *rdev) | 36 | void rs400_gart_adjust_size(struct radeon_device *rdev) |
| 52 | { | 37 | { |
| 53 | /* Check gart size */ | 38 | /* Check gart size */ |
| @@ -238,61 +223,6 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 238 | return 0; | 223 | return 0; |
| 239 | } | 224 | } |
| 240 | 225 | ||
| 241 | |||
| 242 | /* | ||
| 243 | * MC functions. | ||
| 244 | */ | ||
| 245 | int rs400_mc_init(struct radeon_device *rdev) | ||
| 246 | { | ||
| 247 | uint32_t tmp; | ||
| 248 | int r; | ||
| 249 | |||
| 250 | if (r100_debugfs_rbbm_init(rdev)) { | ||
| 251 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
| 252 | } | ||
| 253 | |||
| 254 | rs400_gpu_init(rdev); | ||
| 255 | rs400_gart_disable(rdev); | ||
| 256 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
| 257 | rdev->mc.gtt_location += (rdev->mc.gtt_size - 1); | ||
| 258 | rdev->mc.gtt_location &= ~(rdev->mc.gtt_size - 1); | ||
| 259 | r = radeon_mc_setup(rdev); | ||
| 260 | if (r) { | ||
| 261 | return r; | ||
| 262 | } | ||
| 263 | |||
| 264 | r100_mc_disable_clients(rdev); | ||
| 265 | if (r300_mc_wait_for_idle(rdev)) { | ||
| 266 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
| 267 | "programming pipes. Bad things might happen.\n"); | ||
| 268 | } | ||
| 269 | |||
| 270 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
| 271 | tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16); | ||
| 272 | tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16); | ||
| 273 | WREG32(RADEON_MC_FB_LOCATION, tmp); | ||
| 274 | tmp = RREG32(RADEON_HOST_PATH_CNTL) | RADEON_HP_LIN_RD_CACHE_DIS; | ||
| 275 | WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
| 276 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
| 277 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | ||
| 278 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
| 279 | |||
| 280 | return 0; | ||
| 281 | } | ||
| 282 | |||
| 283 | void rs400_mc_fini(struct radeon_device *rdev) | ||
| 284 | { | ||
| 285 | } | ||
| 286 | |||
| 287 | |||
| 288 | /* | ||
| 289 | * Global GPU functions | ||
| 290 | */ | ||
| 291 | void rs400_errata(struct radeon_device *rdev) | ||
| 292 | { | ||
| 293 | rdev->pll_errata = 0; | ||
| 294 | } | ||
| 295 | |||
| 296 | void rs400_gpu_init(struct radeon_device *rdev) | 226 | void rs400_gpu_init(struct radeon_device *rdev) |
| 297 | { | 227 | { |
| 298 | /* FIXME: HDP same place on rs400 ? */ | 228 | /* FIXME: HDP same place on rs400 ? */ |
| @@ -305,10 +235,6 @@ void rs400_gpu_init(struct radeon_device *rdev) | |||
| 305 | } | 235 | } |
| 306 | } | 236 | } |
| 307 | 237 | ||
| 308 | |||
| 309 | /* | ||
| 310 | * VRAM info. | ||
| 311 | */ | ||
| 312 | void rs400_vram_info(struct radeon_device *rdev) | 238 | void rs400_vram_info(struct radeon_device *rdev) |
| 313 | { | 239 | { |
| 314 | rs400_gart_adjust_size(rdev); | 240 | rs400_gart_adjust_size(rdev); |
| @@ -319,10 +245,6 @@ void rs400_vram_info(struct radeon_device *rdev) | |||
| 319 | r100_vram_init_sizes(rdev); | 245 | r100_vram_init_sizes(rdev); |
| 320 | } | 246 | } |
| 321 | 247 | ||
| 322 | |||
| 323 | /* | ||
| 324 | * Indirect registers accessor | ||
| 325 | */ | ||
| 326 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 248 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
| 327 | { | 249 | { |
| 328 | uint32_t r; | 250 | uint32_t r; |
| @@ -340,10 +262,6 @@ void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 340 | WREG32(RS480_NB_MC_INDEX, 0xff); | 262 | WREG32(RS480_NB_MC_INDEX, 0xff); |
| 341 | } | 263 | } |
| 342 | 264 | ||
| 343 | |||
| 344 | /* | ||
| 345 | * Debugfs info | ||
| 346 | */ | ||
| 347 | #if defined(CONFIG_DEBUG_FS) | 265 | #if defined(CONFIG_DEBUG_FS) |
| 348 | static int rs400_debugfs_gart_info(struct seq_file *m, void *data) | 266 | static int rs400_debugfs_gart_info(struct seq_file *m, void *data) |
| 349 | { | 267 | { |
| @@ -419,7 +337,7 @@ static struct drm_info_list rs400_gart_info_list[] = { | |||
| 419 | }; | 337 | }; |
| 420 | #endif | 338 | #endif |
| 421 | 339 | ||
| 422 | int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | 340 | static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
| 423 | { | 341 | { |
| 424 | #if defined(CONFIG_DEBUG_FS) | 342 | #if defined(CONFIG_DEBUG_FS) |
| 425 | return radeon_debugfs_add_files(rdev, rs400_gart_info_list, 1); | 343 | return radeon_debugfs_add_files(rdev, rs400_gart_info_list, 1); |
| @@ -427,3 +345,188 @@ int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | |||
| 427 | return 0; | 345 | return 0; |
| 428 | #endif | 346 | #endif |
| 429 | } | 347 | } |
| 348 | |||
| 349 | static int rs400_mc_init(struct radeon_device *rdev) | ||
| 350 | { | ||
| 351 | int r; | ||
| 352 | u32 tmp; | ||
| 353 | |||
| 354 | /* Setup GPU memory space */ | ||
| 355 | tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM)); | ||
| 356 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; | ||
| 357 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
| 358 | r = radeon_mc_setup(rdev); | ||
| 359 | if (r) | ||
| 360 | return r; | ||
| 361 | return 0; | ||
| 362 | } | ||
| 363 | |||
| 364 | void rs400_mc_program(struct radeon_device *rdev) | ||
| 365 | { | ||
| 366 | struct r100_mc_save save; | ||
| 367 | |||
| 368 | /* Stops all mc clients */ | ||
| 369 | r100_mc_stop(rdev, &save); | ||
| 370 | |||
| 371 | /* Wait for mc idle */ | ||
| 372 | if (r300_mc_wait_for_idle(rdev)) | ||
| 373 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
| 374 | WREG32(R_000148_MC_FB_LOCATION, | ||
| 375 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
| 376 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
| 377 | |||
| 378 | r100_mc_resume(rdev, &save); | ||
| 379 | } | ||
| 380 | |||
| 381 | static int rs400_startup(struct radeon_device *rdev) | ||
| 382 | { | ||
| 383 | int r; | ||
| 384 | |||
| 385 | rs400_mc_program(rdev); | ||
| 386 | /* Resume clock */ | ||
| 387 | r300_clock_startup(rdev); | ||
| 388 | /* Initialize GPU configuration (# pipes, ...) */ | ||
| 389 | rs400_gpu_init(rdev); | ||
| 390 | /* Initialize GART (initialize after TTM so we can allocate | ||
| 391 | * memory through TTM but finalize after TTM) */ | ||
| 392 | r = rs400_gart_enable(rdev); | ||
| 393 | if (r) | ||
| 394 | return r; | ||
| 395 | /* Enable IRQ */ | ||
| 396 | rdev->irq.sw_int = true; | ||
| 397 | r100_irq_set(rdev); | ||
| 398 | /* 1M ring buffer */ | ||
| 399 | r = r100_cp_init(rdev, 1024 * 1024); | ||
| 400 | if (r) { | ||
| 401 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
| 402 | return r; | ||
| 403 | } | ||
| 404 | r = r100_wb_init(rdev); | ||
| 405 | if (r) | ||
| 406 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
| 407 | r = r100_ib_init(rdev); | ||
| 408 | if (r) { | ||
| 409 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
| 410 | return r; | ||
| 411 | } | ||
| 412 | return 0; | ||
| 413 | } | ||
| 414 | |||
| 415 | int rs400_resume(struct radeon_device *rdev) | ||
| 416 | { | ||
| 417 | /* Make sur GART are not working */ | ||
| 418 | rs400_gart_disable(rdev); | ||
| 419 | /* Resume clock before doing reset */ | ||
| 420 | r300_clock_startup(rdev); | ||
| 421 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 422 | if (radeon_gpu_reset(rdev)) { | ||
| 423 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 424 | RREG32(R_000E40_RBBM_STATUS), | ||
| 425 | RREG32(R_0007C0_CP_STAT)); | ||
| 426 | } | ||
| 427 | /* post */ | ||
| 428 | radeon_combios_asic_init(rdev->ddev); | ||
| 429 | /* Resume clock after posting */ | ||
| 430 | r300_clock_startup(rdev); | ||
| 431 | return rs400_startup(rdev); | ||
| 432 | } | ||
| 433 | |||
| 434 | int rs400_suspend(struct radeon_device *rdev) | ||
| 435 | { | ||
| 436 | r100_cp_disable(rdev); | ||
| 437 | r100_wb_disable(rdev); | ||
| 438 | r100_irq_disable(rdev); | ||
| 439 | rs400_gart_disable(rdev); | ||
| 440 | return 0; | ||
| 441 | } | ||
| 442 | |||
| 443 | void rs400_fini(struct radeon_device *rdev) | ||
| 444 | { | ||
| 445 | rs400_suspend(rdev); | ||
| 446 | r100_cp_fini(rdev); | ||
| 447 | r100_wb_fini(rdev); | ||
| 448 | r100_ib_fini(rdev); | ||
| 449 | radeon_gem_fini(rdev); | ||
| 450 | rs400_gart_fini(rdev); | ||
| 451 | radeon_irq_kms_fini(rdev); | ||
| 452 | radeon_fence_driver_fini(rdev); | ||
| 453 | radeon_object_fini(rdev); | ||
| 454 | radeon_atombios_fini(rdev); | ||
| 455 | kfree(rdev->bios); | ||
| 456 | rdev->bios = NULL; | ||
| 457 | } | ||
| 458 | |||
| 459 | int rs400_init(struct radeon_device *rdev) | ||
| 460 | { | ||
| 461 | int r; | ||
| 462 | |||
| 463 | /* Disable VGA */ | ||
| 464 | r100_vga_render_disable(rdev); | ||
| 465 | /* Initialize scratch registers */ | ||
| 466 | radeon_scratch_init(rdev); | ||
| 467 | /* Initialize surface registers */ | ||
| 468 | radeon_surface_init(rdev); | ||
| 469 | /* TODO: disable VGA need to use VGA request */ | ||
| 470 | /* BIOS*/ | ||
| 471 | if (!radeon_get_bios(rdev)) { | ||
| 472 | if (ASIC_IS_AVIVO(rdev)) | ||
| 473 | return -EINVAL; | ||
| 474 | } | ||
| 475 | if (rdev->is_atom_bios) { | ||
| 476 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); | ||
| 477 | return -EINVAL; | ||
| 478 | } else { | ||
| 479 | r = radeon_combios_init(rdev); | ||
| 480 | if (r) | ||
| 481 | return r; | ||
| 482 | } | ||
| 483 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 484 | if (radeon_gpu_reset(rdev)) { | ||
| 485 | dev_warn(rdev->dev, | ||
| 486 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 487 | RREG32(R_000E40_RBBM_STATUS), | ||
| 488 | RREG32(R_0007C0_CP_STAT)); | ||
| 489 | } | ||
| 490 | /* check if cards are posted or not */ | ||
| 491 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
| 492 | DRM_INFO("GPU not posted. posting now...\n"); | ||
| 493 | radeon_combios_asic_init(rdev->ddev); | ||
| 494 | } | ||
| 495 | /* Initialize clocks */ | ||
| 496 | radeon_get_clock_info(rdev->ddev); | ||
| 497 | /* Get vram informations */ | ||
| 498 | rs400_vram_info(rdev); | ||
| 499 | /* Initialize memory controller (also test AGP) */ | ||
| 500 | r = rs400_mc_init(rdev); | ||
| 501 | if (r) | ||
| 502 | return r; | ||
| 503 | /* Fence driver */ | ||
| 504 | r = radeon_fence_driver_init(rdev); | ||
| 505 | if (r) | ||
| 506 | return r; | ||
| 507 | r = radeon_irq_kms_init(rdev); | ||
| 508 | if (r) | ||
| 509 | return r; | ||
| 510 | /* Memory manager */ | ||
| 511 | r = radeon_object_init(rdev); | ||
| 512 | if (r) | ||
| 513 | return r; | ||
| 514 | r = rs400_gart_init(rdev); | ||
| 515 | if (r) | ||
| 516 | return r; | ||
| 517 | r300_set_reg_safe(rdev); | ||
| 518 | rdev->accel_working = true; | ||
| 519 | r = rs400_startup(rdev); | ||
| 520 | if (r) { | ||
| 521 | /* Somethings want wront with the accel init stop accel */ | ||
| 522 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
| 523 | rs400_suspend(rdev); | ||
| 524 | r100_cp_fini(rdev); | ||
| 525 | r100_wb_fini(rdev); | ||
| 526 | r100_ib_fini(rdev); | ||
| 527 | rs400_gart_fini(rdev); | ||
| 528 | radeon_irq_kms_fini(rdev); | ||
| 529 | rdev->accel_working = false; | ||
| 530 | } | ||
| 531 | return 0; | ||
| 532 | } | ||
diff --git a/drivers/gpu/drm/radeon/rs400d.h b/drivers/gpu/drm/radeon/rs400d.h new file mode 100644 index 000000000000..6d8bac58ced9 --- /dev/null +++ b/drivers/gpu/drm/radeon/rs400d.h | |||
| @@ -0,0 +1,160 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RS400D_H__ | ||
| 29 | #define __RS400D_H__ | ||
| 30 | |||
| 31 | /* Registers */ | ||
| 32 | #define R_000148_MC_FB_LOCATION 0x000148 | ||
| 33 | #define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 34 | #define G_000148_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 35 | #define C_000148_MC_FB_START 0xFFFF0000 | ||
| 36 | #define S_000148_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 37 | #define G_000148_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 38 | #define C_000148_MC_FB_TOP 0x0000FFFF | ||
| 39 | #define R_00015C_NB_TOM 0x00015C | ||
| 40 | #define S_00015C_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 41 | #define G_00015C_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 42 | #define C_00015C_MC_FB_START 0xFFFF0000 | ||
| 43 | #define S_00015C_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 44 | #define G_00015C_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 45 | #define C_00015C_MC_FB_TOP 0x0000FFFF | ||
| 46 | #define R_0007C0_CP_STAT 0x0007C0 | ||
| 47 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
| 48 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
| 49 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
| 50 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
| 51 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
| 52 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
| 53 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
| 54 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
| 55 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
| 56 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
| 57 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
| 58 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
| 59 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
| 60 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
| 61 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
| 62 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
| 63 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
| 64 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
| 65 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
| 66 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
| 67 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
| 68 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
| 69 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
| 70 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
| 71 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
| 72 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
| 73 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
| 74 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
| 75 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
| 76 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
| 77 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
| 78 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
| 79 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
| 80 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
| 81 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
| 82 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
| 83 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
| 84 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
| 85 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
| 86 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
| 87 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
| 88 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
| 89 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
| 90 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
| 91 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
| 92 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
| 93 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
| 94 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
| 95 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
| 96 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
| 97 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
| 98 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
| 99 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
| 100 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
| 101 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
| 102 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
| 103 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
| 104 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
| 105 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
| 106 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
| 107 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
| 108 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
| 109 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
| 110 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
| 111 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
| 112 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
| 113 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
| 114 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
| 115 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
| 116 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
| 117 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
| 118 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
| 119 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
| 120 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
| 121 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
| 122 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
| 123 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
| 124 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
| 125 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
| 126 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
| 127 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
| 128 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
| 129 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
| 130 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
| 131 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
| 132 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
| 133 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
| 134 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
| 135 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
| 136 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
| 137 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
| 138 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
| 139 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
| 140 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
| 141 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
| 142 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
| 143 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
| 144 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
| 145 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
| 146 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
| 147 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
| 148 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
| 149 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
| 150 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
| 151 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
| 152 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
| 153 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
| 154 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
| 155 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
| 156 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
| 157 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
| 158 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
| 159 | |||
| 160 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 4a4fe1cb131c..10dfa78762da 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -25,27 +25,26 @@ | |||
| 25 | * Alex Deucher | 25 | * Alex Deucher |
| 26 | * Jerome Glisse | 26 | * Jerome Glisse |
| 27 | */ | 27 | */ |
| 28 | /* RS600 / Radeon X1250/X1270 integrated GPU | ||
| 29 | * | ||
| 30 | * This file gather function specific to RS600 which is the IGP of | ||
| 31 | * the X1250/X1270 family supporting intel CPU (while RS690/RS740 | ||
| 32 | * is the X1250/X1270 supporting AMD CPU). The display engine are | ||
| 33 | * the avivo one, bios is an atombios, 3D block are the one of the | ||
| 34 | * R4XX family. The GART is different from the RS400 one and is very | ||
| 35 | * close to the one of the R600 family (R600 likely being an evolution | ||
| 36 | * of the RS600 GART block). | ||
| 37 | */ | ||
| 28 | #include "drmP.h" | 38 | #include "drmP.h" |
| 29 | #include "radeon_reg.h" | ||
| 30 | #include "radeon.h" | 39 | #include "radeon.h" |
| 40 | #include "atom.h" | ||
| 41 | #include "rs600d.h" | ||
| 31 | 42 | ||
| 32 | #include "rs600_reg_safe.h" | 43 | #include "rs600_reg_safe.h" |
| 33 | 44 | ||
| 34 | /* rs600 depends on : */ | ||
| 35 | void r100_hdp_reset(struct radeon_device *rdev); | ||
| 36 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
| 37 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 38 | void r420_pipes_init(struct radeon_device *rdev); | ||
| 39 | |||
| 40 | /* This files gather functions specifics to : | ||
| 41 | * rs600 | ||
| 42 | * | ||
| 43 | * Some of these functions might be used by newer ASICs. | ||
| 44 | */ | ||
| 45 | void rs600_gpu_init(struct radeon_device *rdev); | 45 | void rs600_gpu_init(struct radeon_device *rdev); |
| 46 | int rs600_mc_wait_for_idle(struct radeon_device *rdev); | 46 | int rs600_mc_wait_for_idle(struct radeon_device *rdev); |
| 47 | 47 | ||
| 48 | |||
| 49 | /* | 48 | /* |
| 50 | * GART. | 49 | * GART. |
| 51 | */ | 50 | */ |
| @@ -53,18 +52,18 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev) | |||
| 53 | { | 52 | { |
| 54 | uint32_t tmp; | 53 | uint32_t tmp; |
| 55 | 54 | ||
| 56 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 55 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
| 57 | tmp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE); | 56 | tmp &= C_000100_INVALIDATE_ALL_L1_TLBS & C_000100_INVALIDATE_L2_CACHE; |
| 58 | WREG32_MC(RS600_MC_PT0_CNTL, tmp); | 57 | WREG32_MC(R_000100_MC_PT0_CNTL, tmp); |
| 59 | 58 | ||
| 60 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 59 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
| 61 | tmp |= RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE; | 60 | tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) & S_000100_INVALIDATE_L2_CACHE(1); |
| 62 | WREG32_MC(RS600_MC_PT0_CNTL, tmp); | 61 | WREG32_MC(R_000100_MC_PT0_CNTL, tmp); |
| 63 | 62 | ||
| 64 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 63 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
| 65 | tmp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE); | 64 | tmp &= C_000100_INVALIDATE_ALL_L1_TLBS & C_000100_INVALIDATE_L2_CACHE; |
| 66 | WREG32_MC(RS600_MC_PT0_CNTL, tmp); | 65 | WREG32_MC(R_000100_MC_PT0_CNTL, tmp); |
| 67 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 66 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
| 68 | } | 67 | } |
| 69 | 68 | ||
| 70 | int rs600_gart_init(struct radeon_device *rdev) | 69 | int rs600_gart_init(struct radeon_device *rdev) |
| @@ -86,7 +85,7 @@ int rs600_gart_init(struct radeon_device *rdev) | |||
| 86 | 85 | ||
| 87 | int rs600_gart_enable(struct radeon_device *rdev) | 86 | int rs600_gart_enable(struct radeon_device *rdev) |
| 88 | { | 87 | { |
| 89 | uint32_t tmp; | 88 | u32 tmp; |
| 90 | int r, i; | 89 | int r, i; |
| 91 | 90 | ||
| 92 | if (rdev->gart.table.vram.robj == NULL) { | 91 | if (rdev->gart.table.vram.robj == NULL) { |
| @@ -96,46 +95,50 @@ int rs600_gart_enable(struct radeon_device *rdev) | |||
| 96 | r = radeon_gart_table_vram_pin(rdev); | 95 | r = radeon_gart_table_vram_pin(rdev); |
| 97 | if (r) | 96 | if (r) |
| 98 | return r; | 97 | return r; |
| 98 | /* Enable bus master */ | ||
| 99 | tmp = RREG32(R_00004C_BUS_CNTL) & C_00004C_BUS_MASTER_DIS; | ||
| 100 | WREG32(R_00004C_BUS_CNTL, tmp); | ||
| 99 | /* FIXME: setup default page */ | 101 | /* FIXME: setup default page */ |
| 100 | WREG32_MC(RS600_MC_PT0_CNTL, | 102 | WREG32_MC(R_000100_MC_PT0_CNTL, |
| 101 | (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | | 103 | (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) | |
| 102 | RS600_EFFECTIVE_L2_QUEUE_SIZE(6))); | 104 | S_000100_EFFECTIVE_L2_QUEUE_SIZE(6))); |
| 103 | for (i = 0; i < 19; i++) { | 105 | for (i = 0; i < 19; i++) { |
| 104 | WREG32_MC(RS600_MC_PT0_CLIENT0_CNTL + i, | 106 | WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i, |
| 105 | (RS600_ENABLE_TRANSLATION_MODE_OVERRIDE | | 107 | S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) | |
| 106 | RS600_SYSTEM_ACCESS_MODE_IN_SYS | | 108 | S_00016C_SYSTEM_ACCESS_MODE_MASK( |
| 107 | RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_DEFAULT_PAGE | | 109 | V_00016C_SYSTEM_ACCESS_MODE_IN_SYS) | |
| 108 | RS600_EFFECTIVE_L1_CACHE_SIZE(3) | | 110 | S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS( |
| 109 | RS600_ENABLE_FRAGMENT_PROCESSING | | 111 | V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE) | |
| 110 | RS600_EFFECTIVE_L1_QUEUE_SIZE(3))); | 112 | S_00016C_EFFECTIVE_L1_CACHE_SIZE(1) | |
| 113 | S_00016C_ENABLE_FRAGMENT_PROCESSING(1) | | ||
| 114 | S_00016C_EFFECTIVE_L1_QUEUE_SIZE(1)); | ||
| 111 | } | 115 | } |
| 112 | 116 | ||
| 113 | /* System context map to GART space */ | 117 | /* System context map to GART space */ |
| 114 | WREG32_MC(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_location); | 118 | WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_start); |
| 115 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | 119 | WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.gtt_end); |
| 116 | WREG32_MC(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, tmp); | ||
| 117 | 120 | ||
| 118 | /* enable first context */ | 121 | /* enable first context */ |
| 119 | WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_location); | 122 | WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start); |
| 120 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | 123 | WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end); |
| 121 | WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR, tmp); | 124 | WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL, |
| 122 | WREG32_MC(RS600_MC_PT0_CONTEXT0_CNTL, | 125 | S_000102_ENABLE_PAGE_TABLE(1) | |
| 123 | (RS600_ENABLE_PAGE_TABLE | RS600_PAGE_TABLE_TYPE_FLAT)); | 126 | S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT)); |
| 124 | /* disable all other contexts */ | 127 | /* disable all other contexts */ |
| 125 | for (i = 1; i < 8; i++) { | 128 | for (i = 1; i < 8; i++) { |
| 126 | WREG32_MC(RS600_MC_PT0_CONTEXT0_CNTL + i, 0); | 129 | WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0); |
| 127 | } | 130 | } |
| 128 | 131 | ||
| 129 | /* setup the page table */ | 132 | /* setup the page table */ |
| 130 | WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR, | 133 | WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR, |
| 131 | rdev->gart.table_addr); | 134 | rdev->gart.table_addr); |
| 132 | WREG32_MC(RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0); | 135 | WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0); |
| 133 | 136 | ||
| 134 | /* enable page tables */ | 137 | /* enable page tables */ |
| 135 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 138 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
| 136 | WREG32_MC(RS600_MC_PT0_CNTL, (tmp | RS600_ENABLE_PT)); | 139 | WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1))); |
| 137 | tmp = RREG32_MC(RS600_MC_CNTL1); | 140 | tmp = RREG32_MC(R_000009_MC_CNTL1); |
| 138 | WREG32_MC(RS600_MC_CNTL1, (tmp | RS600_ENABLE_PAGE_TABLES)); | 141 | WREG32_MC(R_000009_MC_CNTL1, (tmp | S_000009_ENABLE_PAGE_TABLES(1))); |
| 139 | rs600_gart_tlb_flush(rdev); | 142 | rs600_gart_tlb_flush(rdev); |
| 140 | rdev->gart.ready = true; | 143 | rdev->gart.ready = true; |
| 141 | return 0; | 144 | return 0; |
| @@ -146,10 +149,9 @@ void rs600_gart_disable(struct radeon_device *rdev) | |||
| 146 | uint32_t tmp; | 149 | uint32_t tmp; |
| 147 | 150 | ||
| 148 | /* FIXME: disable out of gart access */ | 151 | /* FIXME: disable out of gart access */ |
| 149 | WREG32_MC(RS600_MC_PT0_CNTL, 0); | 152 | WREG32_MC(R_000100_MC_PT0_CNTL, 0); |
| 150 | tmp = RREG32_MC(RS600_MC_CNTL1); | 153 | tmp = RREG32_MC(R_000009_MC_CNTL1); |
| 151 | tmp &= ~RS600_ENABLE_PAGE_TABLES; | 154 | WREG32_MC(R_000009_MC_CNTL1, tmp & C_000009_ENABLE_PAGE_TABLES); |
| 152 | WREG32_MC(RS600_MC_CNTL1, tmp); | ||
| 153 | if (rdev->gart.table.vram.robj) { | 155 | if (rdev->gart.table.vram.robj) { |
| 154 | radeon_object_kunmap(rdev->gart.table.vram.robj); | 156 | radeon_object_kunmap(rdev->gart.table.vram.robj); |
| 155 | radeon_object_unpin(rdev->gart.table.vram.robj); | 157 | radeon_object_unpin(rdev->gart.table.vram.robj); |
| @@ -183,129 +185,61 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
| 183 | return 0; | 185 | return 0; |
| 184 | } | 186 | } |
| 185 | 187 | ||
| 186 | |||
| 187 | /* | ||
| 188 | * MC. | ||
| 189 | */ | ||
| 190 | void rs600_mc_disable_clients(struct radeon_device *rdev) | ||
| 191 | { | ||
| 192 | unsigned tmp; | ||
| 193 | |||
| 194 | if (r100_gui_wait_for_idle(rdev)) { | ||
| 195 | printk(KERN_WARNING "Failed to wait GUI idle while " | ||
| 196 | "programming pipes. Bad things might happen.\n"); | ||
| 197 | } | ||
| 198 | |||
| 199 | rv515_vga_render_disable(rdev); | ||
| 200 | |||
| 201 | tmp = RREG32(AVIVO_D1VGA_CONTROL); | ||
| 202 | WREG32(AVIVO_D1VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); | ||
| 203 | tmp = RREG32(AVIVO_D2VGA_CONTROL); | ||
| 204 | WREG32(AVIVO_D2VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); | ||
| 205 | |||
| 206 | tmp = RREG32(AVIVO_D1CRTC_CONTROL); | ||
| 207 | WREG32(AVIVO_D1CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN); | ||
| 208 | tmp = RREG32(AVIVO_D2CRTC_CONTROL); | ||
| 209 | WREG32(AVIVO_D2CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN); | ||
| 210 | |||
| 211 | /* make sure all previous write got through */ | ||
| 212 | tmp = RREG32(AVIVO_D2CRTC_CONTROL); | ||
| 213 | |||
| 214 | mdelay(1); | ||
| 215 | } | ||
| 216 | |||
| 217 | int rs600_mc_init(struct radeon_device *rdev) | ||
| 218 | { | ||
| 219 | uint32_t tmp; | ||
| 220 | int r; | ||
| 221 | |||
| 222 | if (r100_debugfs_rbbm_init(rdev)) { | ||
| 223 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
| 224 | } | ||
| 225 | |||
| 226 | rs600_gpu_init(rdev); | ||
| 227 | rs600_gart_disable(rdev); | ||
| 228 | |||
| 229 | /* Setup GPU memory space */ | ||
| 230 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
| 231 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
| 232 | r = radeon_mc_setup(rdev); | ||
| 233 | if (r) { | ||
| 234 | return r; | ||
| 235 | } | ||
| 236 | |||
| 237 | /* Program GPU memory space */ | ||
| 238 | /* Enable bus master */ | ||
| 239 | tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; | ||
| 240 | WREG32(RADEON_BUS_CNTL, tmp); | ||
| 241 | /* FIXME: What does AGP means for such chipset ? */ | ||
| 242 | WREG32_MC(RS600_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
| 243 | /* FIXME: are this AGP reg in indirect MC range ? */ | ||
| 244 | WREG32_MC(RS600_MC_AGP_BASE, 0); | ||
| 245 | WREG32_MC(RS600_MC_AGP_BASE_2, 0); | ||
| 246 | rs600_mc_disable_clients(rdev); | ||
| 247 | if (rs600_mc_wait_for_idle(rdev)) { | ||
| 248 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
| 249 | "programming pipes. Bad things might happen.\n"); | ||
| 250 | } | ||
| 251 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
| 252 | tmp = REG_SET(RS600_MC_FB_TOP, tmp >> 16); | ||
| 253 | tmp |= REG_SET(RS600_MC_FB_START, rdev->mc.vram_location >> 16); | ||
| 254 | WREG32_MC(RS600_MC_FB_LOCATION, tmp); | ||
| 255 | WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16); | ||
| 256 | return 0; | ||
| 257 | } | ||
| 258 | |||
| 259 | void rs600_mc_fini(struct radeon_device *rdev) | ||
| 260 | { | ||
| 261 | } | ||
| 262 | |||
| 263 | |||
| 264 | /* | ||
| 265 | * Interrupts | ||
| 266 | */ | ||
| 267 | int rs600_irq_set(struct radeon_device *rdev) | 188 | int rs600_irq_set(struct radeon_device *rdev) |
| 268 | { | 189 | { |
| 269 | uint32_t tmp = 0; | 190 | uint32_t tmp = 0; |
| 270 | uint32_t mode_int = 0; | 191 | uint32_t mode_int = 0; |
| 271 | 192 | ||
| 272 | if (rdev->irq.sw_int) { | 193 | if (rdev->irq.sw_int) { |
| 273 | tmp |= RADEON_SW_INT_ENABLE; | 194 | tmp |= S_000040_SW_INT_EN(1); |
| 274 | } | 195 | } |
| 275 | if (rdev->irq.crtc_vblank_int[0]) { | 196 | if (rdev->irq.crtc_vblank_int[0]) { |
| 276 | mode_int |= AVIVO_D1MODE_INT_MASK; | 197 | mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1); |
| 277 | } | 198 | } |
| 278 | if (rdev->irq.crtc_vblank_int[1]) { | 199 | if (rdev->irq.crtc_vblank_int[1]) { |
| 279 | mode_int |= AVIVO_D2MODE_INT_MASK; | 200 | mode_int |= S_006540_D2MODE_VBLANK_INT_MASK(1); |
| 280 | } | 201 | } |
| 281 | WREG32(RADEON_GEN_INT_CNTL, tmp); | 202 | WREG32(R_000040_GEN_INT_CNTL, tmp); |
| 282 | WREG32(AVIVO_DxMODE_INT_MASK, mode_int); | 203 | WREG32(R_006540_DxMODE_INT_MASK, mode_int); |
| 283 | return 0; | 204 | return 0; |
| 284 | } | 205 | } |
| 285 | 206 | ||
| 286 | static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) | 207 | static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) |
| 287 | { | 208 | { |
| 288 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | 209 | uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS); |
| 289 | uint32_t irq_mask = RADEON_SW_INT_TEST; | 210 | uint32_t irq_mask = ~C_000044_SW_INT; |
| 290 | 211 | ||
| 291 | if (irqs & AVIVO_DISPLAY_INT_STATUS) { | 212 | if (G_000044_DISPLAY_INT_STAT(irqs)) { |
| 292 | *r500_disp_int = RREG32(AVIVO_DISP_INTERRUPT_STATUS); | 213 | *r500_disp_int = RREG32(R_007EDC_DISP_INTERRUPT_STATUS); |
| 293 | if (*r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { | 214 | if (G_007EDC_LB_D1_VBLANK_INTERRUPT(*r500_disp_int)) { |
| 294 | WREG32(AVIVO_D1MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); | 215 | WREG32(R_006534_D1MODE_VBLANK_STATUS, |
| 216 | S_006534_D1MODE_VBLANK_ACK(1)); | ||
| 295 | } | 217 | } |
| 296 | if (*r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { | 218 | if (G_007EDC_LB_D2_VBLANK_INTERRUPT(*r500_disp_int)) { |
| 297 | WREG32(AVIVO_D2MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); | 219 | WREG32(R_006D34_D2MODE_VBLANK_STATUS, |
| 220 | S_006D34_D2MODE_VBLANK_ACK(1)); | ||
| 298 | } | 221 | } |
| 299 | } else { | 222 | } else { |
| 300 | *r500_disp_int = 0; | 223 | *r500_disp_int = 0; |
| 301 | } | 224 | } |
| 302 | 225 | ||
| 303 | if (irqs) { | 226 | if (irqs) { |
| 304 | WREG32(RADEON_GEN_INT_STATUS, irqs); | 227 | WREG32(R_000044_GEN_INT_STATUS, irqs); |
| 305 | } | 228 | } |
| 306 | return irqs & irq_mask; | 229 | return irqs & irq_mask; |
| 307 | } | 230 | } |
| 308 | 231 | ||
| 232 | void rs600_irq_disable(struct radeon_device *rdev) | ||
| 233 | { | ||
| 234 | u32 tmp; | ||
| 235 | |||
| 236 | WREG32(R_000040_GEN_INT_CNTL, 0); | ||
| 237 | WREG32(R_006540_DxMODE_INT_MASK, 0); | ||
| 238 | /* Wait and acknowledge irq */ | ||
| 239 | mdelay(1); | ||
| 240 | rs600_irq_ack(rdev, &tmp); | ||
| 241 | } | ||
| 242 | |||
| 309 | int rs600_irq_process(struct radeon_device *rdev) | 243 | int rs600_irq_process(struct radeon_device *rdev) |
| 310 | { | 244 | { |
| 311 | uint32_t status; | 245 | uint32_t status; |
| @@ -317,16 +251,13 @@ int rs600_irq_process(struct radeon_device *rdev) | |||
| 317 | } | 251 | } |
| 318 | while (status || r500_disp_int) { | 252 | while (status || r500_disp_int) { |
| 319 | /* SW interrupt */ | 253 | /* SW interrupt */ |
| 320 | if (status & RADEON_SW_INT_TEST) { | 254 | if (G_000040_SW_INT_EN(status)) |
| 321 | radeon_fence_process(rdev); | 255 | radeon_fence_process(rdev); |
| 322 | } | ||
| 323 | /* Vertical blank interrupts */ | 256 | /* Vertical blank interrupts */ |
| 324 | if (r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { | 257 | if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int)) |
| 325 | drm_handle_vblank(rdev->ddev, 0); | 258 | drm_handle_vblank(rdev->ddev, 0); |
| 326 | } | 259 | if (G_007EDC_LB_D2_VBLANK_INTERRUPT(r500_disp_int)) |
| 327 | if (r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { | ||
| 328 | drm_handle_vblank(rdev->ddev, 1); | 260 | drm_handle_vblank(rdev->ddev, 1); |
| 329 | } | ||
| 330 | status = rs600_irq_ack(rdev, &r500_disp_int); | 261 | status = rs600_irq_ack(rdev, &r500_disp_int); |
| 331 | } | 262 | } |
| 332 | return IRQ_HANDLED; | 263 | return IRQ_HANDLED; |
| @@ -335,53 +266,34 @@ int rs600_irq_process(struct radeon_device *rdev) | |||
| 335 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc) | 266 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc) |
| 336 | { | 267 | { |
| 337 | if (crtc == 0) | 268 | if (crtc == 0) |
| 338 | return RREG32(AVIVO_D1CRTC_FRAME_COUNT); | 269 | return RREG32(R_0060A4_D1CRTC_STATUS_FRAME_COUNT); |
| 339 | else | 270 | else |
| 340 | return RREG32(AVIVO_D2CRTC_FRAME_COUNT); | 271 | return RREG32(R_0068A4_D2CRTC_STATUS_FRAME_COUNT); |
| 341 | } | 272 | } |
| 342 | 273 | ||
| 343 | |||
| 344 | /* | ||
| 345 | * Global GPU functions | ||
| 346 | */ | ||
| 347 | int rs600_mc_wait_for_idle(struct radeon_device *rdev) | 274 | int rs600_mc_wait_for_idle(struct radeon_device *rdev) |
| 348 | { | 275 | { |
| 349 | unsigned i; | 276 | unsigned i; |
| 350 | uint32_t tmp; | ||
| 351 | 277 | ||
| 352 | for (i = 0; i < rdev->usec_timeout; i++) { | 278 | for (i = 0; i < rdev->usec_timeout; i++) { |
| 353 | /* read MC_STATUS */ | 279 | if (G_000000_MC_IDLE(RREG32_MC(R_000000_MC_STATUS))) |
| 354 | tmp = RREG32_MC(RS600_MC_STATUS); | ||
| 355 | if (tmp & RS600_MC_STATUS_IDLE) { | ||
| 356 | return 0; | 280 | return 0; |
| 357 | } | 281 | udelay(1); |
| 358 | DRM_UDELAY(1); | ||
| 359 | } | 282 | } |
| 360 | return -1; | 283 | return -1; |
| 361 | } | 284 | } |
| 362 | 285 | ||
| 363 | void rs600_errata(struct radeon_device *rdev) | ||
| 364 | { | ||
| 365 | rdev->pll_errata = 0; | ||
| 366 | } | ||
| 367 | |||
| 368 | void rs600_gpu_init(struct radeon_device *rdev) | 286 | void rs600_gpu_init(struct radeon_device *rdev) |
| 369 | { | 287 | { |
| 370 | /* FIXME: HDP same place on rs600 ? */ | 288 | /* FIXME: HDP same place on rs600 ? */ |
| 371 | r100_hdp_reset(rdev); | 289 | r100_hdp_reset(rdev); |
| 372 | rv515_vga_render_disable(rdev); | ||
| 373 | /* FIXME: is this correct ? */ | 290 | /* FIXME: is this correct ? */ |
| 374 | r420_pipes_init(rdev); | 291 | r420_pipes_init(rdev); |
| 375 | if (rs600_mc_wait_for_idle(rdev)) { | 292 | /* Wait for mc idle */ |
| 376 | printk(KERN_WARNING "Failed to wait MC idle while " | 293 | if (rs600_mc_wait_for_idle(rdev)) |
| 377 | "programming pipes. Bad things might happen.\n"); | 294 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); |
| 378 | } | ||
| 379 | } | 295 | } |
| 380 | 296 | ||
| 381 | |||
| 382 | /* | ||
| 383 | * VRAM info. | ||
| 384 | */ | ||
| 385 | void rs600_vram_info(struct radeon_device *rdev) | 297 | void rs600_vram_info(struct radeon_device *rdev) |
| 386 | { | 298 | { |
| 387 | /* FIXME: to do or is these values sane ? */ | 299 | /* FIXME: to do or is these values sane ? */ |
| @@ -394,31 +306,206 @@ void rs600_bandwidth_update(struct radeon_device *rdev) | |||
| 394 | /* FIXME: implement, should this be like rs690 ? */ | 306 | /* FIXME: implement, should this be like rs690 ? */ |
| 395 | } | 307 | } |
| 396 | 308 | ||
| 397 | |||
| 398 | /* | ||
| 399 | * Indirect registers accessor | ||
| 400 | */ | ||
| 401 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 309 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
| 402 | { | 310 | { |
| 403 | uint32_t r; | 311 | WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) | |
| 404 | 312 | S_000070_MC_IND_CITF_ARB0(1)); | |
| 405 | WREG32(RS600_MC_INDEX, | 313 | return RREG32(R_000074_MC_IND_DATA); |
| 406 | ((reg & RS600_MC_ADDR_MASK) | RS600_MC_IND_CITF_ARB0)); | ||
| 407 | r = RREG32(RS600_MC_DATA); | ||
| 408 | return r; | ||
| 409 | } | 314 | } |
| 410 | 315 | ||
| 411 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | 316 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) |
| 412 | { | 317 | { |
| 413 | WREG32(RS600_MC_INDEX, | 318 | WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) | |
| 414 | RS600_MC_IND_WR_EN | RS600_MC_IND_CITF_ARB0 | | 319 | S_000070_MC_IND_CITF_ARB0(1) | S_000070_MC_IND_WR_EN(1)); |
| 415 | ((reg) & RS600_MC_ADDR_MASK)); | 320 | WREG32(R_000074_MC_IND_DATA, v); |
| 416 | WREG32(RS600_MC_DATA, v); | ||
| 417 | } | 321 | } |
| 418 | 322 | ||
| 419 | int rs600_init(struct radeon_device *rdev) | 323 | void rs600_debugfs(struct radeon_device *rdev) |
| 324 | { | ||
| 325 | if (r100_debugfs_rbbm_init(rdev)) | ||
| 326 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
| 327 | } | ||
| 328 | |||
| 329 | void rs600_set_safe_registers(struct radeon_device *rdev) | ||
| 420 | { | 330 | { |
| 421 | rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm; | 331 | rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm; |
| 422 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm); | 332 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm); |
| 333 | } | ||
| 334 | |||
| 335 | static void rs600_mc_program(struct radeon_device *rdev) | ||
| 336 | { | ||
| 337 | struct rv515_mc_save save; | ||
| 338 | |||
| 339 | /* Stops all mc clients */ | ||
| 340 | rv515_mc_stop(rdev, &save); | ||
| 341 | |||
| 342 | /* Wait for mc idle */ | ||
| 343 | if (rs600_mc_wait_for_idle(rdev)) | ||
| 344 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
| 345 | |||
| 346 | /* FIXME: What does AGP means for such chipset ? */ | ||
| 347 | WREG32_MC(R_000005_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
| 348 | WREG32_MC(R_000006_AGP_BASE, 0); | ||
| 349 | WREG32_MC(R_000007_AGP_BASE_2, 0); | ||
| 350 | /* Program MC */ | ||
| 351 | WREG32_MC(R_000004_MC_FB_LOCATION, | ||
| 352 | S_000004_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
| 353 | S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
| 354 | WREG32(R_000134_HDP_FB_LOCATION, | ||
| 355 | S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | ||
| 356 | |||
| 357 | rv515_mc_resume(rdev, &save); | ||
| 358 | } | ||
| 359 | |||
| 360 | static int rs600_startup(struct radeon_device *rdev) | ||
| 361 | { | ||
| 362 | int r; | ||
| 363 | |||
| 364 | rs600_mc_program(rdev); | ||
| 365 | /* Resume clock */ | ||
| 366 | rv515_clock_startup(rdev); | ||
| 367 | /* Initialize GPU configuration (# pipes, ...) */ | ||
| 368 | rs600_gpu_init(rdev); | ||
| 369 | /* Initialize GART (initialize after TTM so we can allocate | ||
| 370 | * memory through TTM but finalize after TTM) */ | ||
| 371 | r = rs600_gart_enable(rdev); | ||
| 372 | if (r) | ||
| 373 | return r; | ||
| 374 | /* Enable IRQ */ | ||
| 375 | rdev->irq.sw_int = true; | ||
| 376 | rs600_irq_set(rdev); | ||
| 377 | /* 1M ring buffer */ | ||
| 378 | r = r100_cp_init(rdev, 1024 * 1024); | ||
| 379 | if (r) { | ||
| 380 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
| 381 | return r; | ||
| 382 | } | ||
| 383 | r = r100_wb_init(rdev); | ||
| 384 | if (r) | ||
| 385 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
| 386 | r = r100_ib_init(rdev); | ||
| 387 | if (r) { | ||
| 388 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
| 389 | return r; | ||
| 390 | } | ||
| 391 | return 0; | ||
| 392 | } | ||
| 393 | |||
| 394 | int rs600_resume(struct radeon_device *rdev) | ||
| 395 | { | ||
| 396 | /* Make sur GART are not working */ | ||
| 397 | rs600_gart_disable(rdev); | ||
| 398 | /* Resume clock before doing reset */ | ||
| 399 | rv515_clock_startup(rdev); | ||
| 400 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 401 | if (radeon_gpu_reset(rdev)) { | ||
| 402 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 403 | RREG32(R_000E40_RBBM_STATUS), | ||
| 404 | RREG32(R_0007C0_CP_STAT)); | ||
| 405 | } | ||
| 406 | /* post */ | ||
| 407 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 408 | /* Resume clock after posting */ | ||
| 409 | rv515_clock_startup(rdev); | ||
| 410 | return rs600_startup(rdev); | ||
| 411 | } | ||
| 412 | |||
| 413 | int rs600_suspend(struct radeon_device *rdev) | ||
| 414 | { | ||
| 415 | r100_cp_disable(rdev); | ||
| 416 | r100_wb_disable(rdev); | ||
| 417 | rs600_irq_disable(rdev); | ||
| 418 | rs600_gart_disable(rdev); | ||
| 419 | return 0; | ||
| 420 | } | ||
| 421 | |||
| 422 | void rs600_fini(struct radeon_device *rdev) | ||
| 423 | { | ||
| 424 | rs600_suspend(rdev); | ||
| 425 | r100_cp_fini(rdev); | ||
| 426 | r100_wb_fini(rdev); | ||
| 427 | r100_ib_fini(rdev); | ||
| 428 | radeon_gem_fini(rdev); | ||
| 429 | rs600_gart_fini(rdev); | ||
| 430 | radeon_irq_kms_fini(rdev); | ||
| 431 | radeon_fence_driver_fini(rdev); | ||
| 432 | radeon_object_fini(rdev); | ||
| 433 | radeon_atombios_fini(rdev); | ||
| 434 | kfree(rdev->bios); | ||
| 435 | rdev->bios = NULL; | ||
| 436 | } | ||
| 437 | |||
| 438 | int rs600_init(struct radeon_device *rdev) | ||
| 439 | { | ||
| 440 | int r; | ||
| 441 | |||
| 442 | /* Disable VGA */ | ||
| 443 | rv515_vga_render_disable(rdev); | ||
| 444 | /* Initialize scratch registers */ | ||
| 445 | radeon_scratch_init(rdev); | ||
| 446 | /* Initialize surface registers */ | ||
| 447 | radeon_surface_init(rdev); | ||
| 448 | /* BIOS */ | ||
| 449 | if (!radeon_get_bios(rdev)) { | ||
| 450 | if (ASIC_IS_AVIVO(rdev)) | ||
| 451 | return -EINVAL; | ||
| 452 | } | ||
| 453 | if (rdev->is_atom_bios) { | ||
| 454 | r = radeon_atombios_init(rdev); | ||
| 455 | if (r) | ||
| 456 | return r; | ||
| 457 | } else { | ||
| 458 | dev_err(rdev->dev, "Expecting atombios for RS600 GPU\n"); | ||
| 459 | return -EINVAL; | ||
| 460 | } | ||
| 461 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 462 | if (radeon_gpu_reset(rdev)) { | ||
| 463 | dev_warn(rdev->dev, | ||
| 464 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 465 | RREG32(R_000E40_RBBM_STATUS), | ||
| 466 | RREG32(R_0007C0_CP_STAT)); | ||
| 467 | } | ||
| 468 | /* check if cards are posted or not */ | ||
| 469 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
| 470 | DRM_INFO("GPU not posted. posting now...\n"); | ||
| 471 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 472 | } | ||
| 473 | /* Initialize clocks */ | ||
| 474 | radeon_get_clock_info(rdev->ddev); | ||
| 475 | /* Get vram informations */ | ||
| 476 | rs600_vram_info(rdev); | ||
| 477 | /* Initialize memory controller (also test AGP) */ | ||
| 478 | r = r420_mc_init(rdev); | ||
| 479 | if (r) | ||
| 480 | return r; | ||
| 481 | rs600_debugfs(rdev); | ||
| 482 | /* Fence driver */ | ||
| 483 | r = radeon_fence_driver_init(rdev); | ||
| 484 | if (r) | ||
| 485 | return r; | ||
| 486 | r = radeon_irq_kms_init(rdev); | ||
| 487 | if (r) | ||
| 488 | return r; | ||
| 489 | /* Memory manager */ | ||
| 490 | r = radeon_object_init(rdev); | ||
| 491 | if (r) | ||
| 492 | return r; | ||
| 493 | r = rs600_gart_init(rdev); | ||
| 494 | if (r) | ||
| 495 | return r; | ||
| 496 | rs600_set_safe_registers(rdev); | ||
| 497 | rdev->accel_working = true; | ||
| 498 | r = rs600_startup(rdev); | ||
| 499 | if (r) { | ||
| 500 | /* Somethings want wront with the accel init stop accel */ | ||
| 501 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
| 502 | rs600_suspend(rdev); | ||
| 503 | r100_cp_fini(rdev); | ||
| 504 | r100_wb_fini(rdev); | ||
| 505 | r100_ib_fini(rdev); | ||
| 506 | rs600_gart_fini(rdev); | ||
| 507 | radeon_irq_kms_fini(rdev); | ||
| 508 | rdev->accel_working = false; | ||
| 509 | } | ||
| 423 | return 0; | 510 | return 0; |
| 424 | } | 511 | } |
diff --git a/drivers/gpu/drm/radeon/rs600d.h b/drivers/gpu/drm/radeon/rs600d.h new file mode 100644 index 000000000000..81308924859a --- /dev/null +++ b/drivers/gpu/drm/radeon/rs600d.h | |||
| @@ -0,0 +1,470 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RS600D_H__ | ||
| 29 | #define __RS600D_H__ | ||
| 30 | |||
| 31 | /* Registers */ | ||
| 32 | #define R_000040_GEN_INT_CNTL 0x000040 | ||
| 33 | #define S_000040_DISPLAY_INT_STATUS(x) (((x) & 0x1) << 0) | ||
| 34 | #define G_000040_DISPLAY_INT_STATUS(x) (((x) >> 0) & 0x1) | ||
| 35 | #define C_000040_DISPLAY_INT_STATUS 0xFFFFFFFE | ||
| 36 | #define S_000040_DMA_VIPH0_INT_EN(x) (((x) & 0x1) << 12) | ||
| 37 | #define G_000040_DMA_VIPH0_INT_EN(x) (((x) >> 12) & 0x1) | ||
| 38 | #define C_000040_DMA_VIPH0_INT_EN 0xFFFFEFFF | ||
| 39 | #define S_000040_CRTC2_VSYNC(x) (((x) & 0x1) << 6) | ||
| 40 | #define G_000040_CRTC2_VSYNC(x) (((x) >> 6) & 0x1) | ||
| 41 | #define C_000040_CRTC2_VSYNC 0xFFFFFFBF | ||
| 42 | #define S_000040_SNAPSHOT2(x) (((x) & 0x1) << 7) | ||
| 43 | #define G_000040_SNAPSHOT2(x) (((x) >> 7) & 0x1) | ||
| 44 | #define C_000040_SNAPSHOT2 0xFFFFFF7F | ||
| 45 | #define S_000040_CRTC2_VBLANK(x) (((x) & 0x1) << 9) | ||
| 46 | #define G_000040_CRTC2_VBLANK(x) (((x) >> 9) & 0x1) | ||
| 47 | #define C_000040_CRTC2_VBLANK 0xFFFFFDFF | ||
| 48 | #define S_000040_FP2_DETECT(x) (((x) & 0x1) << 10) | ||
| 49 | #define G_000040_FP2_DETECT(x) (((x) >> 10) & 0x1) | ||
| 50 | #define C_000040_FP2_DETECT 0xFFFFFBFF | ||
| 51 | #define S_000040_VSYNC_DIFF_OVER_LIMIT(x) (((x) & 0x1) << 11) | ||
| 52 | #define G_000040_VSYNC_DIFF_OVER_LIMIT(x) (((x) >> 11) & 0x1) | ||
| 53 | #define C_000040_VSYNC_DIFF_OVER_LIMIT 0xFFFFF7FF | ||
| 54 | #define S_000040_DMA_VIPH1_INT_EN(x) (((x) & 0x1) << 13) | ||
| 55 | #define G_000040_DMA_VIPH1_INT_EN(x) (((x) >> 13) & 0x1) | ||
| 56 | #define C_000040_DMA_VIPH1_INT_EN 0xFFFFDFFF | ||
| 57 | #define S_000040_DMA_VIPH2_INT_EN(x) (((x) & 0x1) << 14) | ||
| 58 | #define G_000040_DMA_VIPH2_INT_EN(x) (((x) >> 14) & 0x1) | ||
| 59 | #define C_000040_DMA_VIPH2_INT_EN 0xFFFFBFFF | ||
| 60 | #define S_000040_DMA_VIPH3_INT_EN(x) (((x) & 0x1) << 15) | ||
| 61 | #define G_000040_DMA_VIPH3_INT_EN(x) (((x) >> 15) & 0x1) | ||
| 62 | #define C_000040_DMA_VIPH3_INT_EN 0xFFFF7FFF | ||
| 63 | #define S_000040_I2C_INT_EN(x) (((x) & 0x1) << 17) | ||
| 64 | #define G_000040_I2C_INT_EN(x) (((x) >> 17) & 0x1) | ||
| 65 | #define C_000040_I2C_INT_EN 0xFFFDFFFF | ||
| 66 | #define S_000040_GUI_IDLE(x) (((x) & 0x1) << 19) | ||
| 67 | #define G_000040_GUI_IDLE(x) (((x) >> 19) & 0x1) | ||
| 68 | #define C_000040_GUI_IDLE 0xFFF7FFFF | ||
| 69 | #define S_000040_VIPH_INT_EN(x) (((x) & 0x1) << 24) | ||
| 70 | #define G_000040_VIPH_INT_EN(x) (((x) >> 24) & 0x1) | ||
| 71 | #define C_000040_VIPH_INT_EN 0xFEFFFFFF | ||
| 72 | #define S_000040_SW_INT_EN(x) (((x) & 0x1) << 25) | ||
| 73 | #define G_000040_SW_INT_EN(x) (((x) >> 25) & 0x1) | ||
| 74 | #define C_000040_SW_INT_EN 0xFDFFFFFF | ||
| 75 | #define S_000040_GEYSERVILLE(x) (((x) & 0x1) << 27) | ||
| 76 | #define G_000040_GEYSERVILLE(x) (((x) >> 27) & 0x1) | ||
| 77 | #define C_000040_GEYSERVILLE 0xF7FFFFFF | ||
| 78 | #define S_000040_HDCP_AUTHORIZED_INT(x) (((x) & 0x1) << 28) | ||
| 79 | #define G_000040_HDCP_AUTHORIZED_INT(x) (((x) >> 28) & 0x1) | ||
| 80 | #define C_000040_HDCP_AUTHORIZED_INT 0xEFFFFFFF | ||
| 81 | #define S_000040_DVI_I2C_INT(x) (((x) & 0x1) << 29) | ||
| 82 | #define G_000040_DVI_I2C_INT(x) (((x) >> 29) & 0x1) | ||
| 83 | #define C_000040_DVI_I2C_INT 0xDFFFFFFF | ||
| 84 | #define S_000040_GUIDMA(x) (((x) & 0x1) << 30) | ||
| 85 | #define G_000040_GUIDMA(x) (((x) >> 30) & 0x1) | ||
| 86 | #define C_000040_GUIDMA 0xBFFFFFFF | ||
| 87 | #define S_000040_VIDDMA(x) (((x) & 0x1) << 31) | ||
| 88 | #define G_000040_VIDDMA(x) (((x) >> 31) & 0x1) | ||
| 89 | #define C_000040_VIDDMA 0x7FFFFFFF | ||
| 90 | #define R_000044_GEN_INT_STATUS 0x000044 | ||
| 91 | #define S_000044_DISPLAY_INT_STAT(x) (((x) & 0x1) << 0) | ||
| 92 | #define G_000044_DISPLAY_INT_STAT(x) (((x) >> 0) & 0x1) | ||
| 93 | #define C_000044_DISPLAY_INT_STAT 0xFFFFFFFE | ||
| 94 | #define S_000044_VGA_INT_STAT(x) (((x) & 0x1) << 1) | ||
| 95 | #define G_000044_VGA_INT_STAT(x) (((x) >> 1) & 0x1) | ||
| 96 | #define C_000044_VGA_INT_STAT 0xFFFFFFFD | ||
| 97 | #define S_000044_CAP0_INT_ACTIVE(x) (((x) & 0x1) << 8) | ||
| 98 | #define G_000044_CAP0_INT_ACTIVE(x) (((x) >> 8) & 0x1) | ||
| 99 | #define C_000044_CAP0_INT_ACTIVE 0xFFFFFEFF | ||
| 100 | #define S_000044_DMA_VIPH0_INT(x) (((x) & 0x1) << 12) | ||
| 101 | #define G_000044_DMA_VIPH0_INT(x) (((x) >> 12) & 0x1) | ||
| 102 | #define C_000044_DMA_VIPH0_INT 0xFFFFEFFF | ||
| 103 | #define S_000044_DMA_VIPH1_INT(x) (((x) & 0x1) << 13) | ||
| 104 | #define G_000044_DMA_VIPH1_INT(x) (((x) >> 13) & 0x1) | ||
| 105 | #define C_000044_DMA_VIPH1_INT 0xFFFFDFFF | ||
| 106 | #define S_000044_DMA_VIPH2_INT(x) (((x) & 0x1) << 14) | ||
| 107 | #define G_000044_DMA_VIPH2_INT(x) (((x) >> 14) & 0x1) | ||
| 108 | #define C_000044_DMA_VIPH2_INT 0xFFFFBFFF | ||
| 109 | #define S_000044_DMA_VIPH3_INT(x) (((x) & 0x1) << 15) | ||
| 110 | #define G_000044_DMA_VIPH3_INT(x) (((x) >> 15) & 0x1) | ||
| 111 | #define C_000044_DMA_VIPH3_INT 0xFFFF7FFF | ||
| 112 | #define S_000044_MC_PROBE_FAULT_STAT(x) (((x) & 0x1) << 16) | ||
| 113 | #define G_000044_MC_PROBE_FAULT_STAT(x) (((x) >> 16) & 0x1) | ||
| 114 | #define C_000044_MC_PROBE_FAULT_STAT 0xFFFEFFFF | ||
| 115 | #define S_000044_I2C_INT(x) (((x) & 0x1) << 17) | ||
| 116 | #define G_000044_I2C_INT(x) (((x) >> 17) & 0x1) | ||
| 117 | #define C_000044_I2C_INT 0xFFFDFFFF | ||
| 118 | #define S_000044_SCRATCH_INT_STAT(x) (((x) & 0x1) << 18) | ||
| 119 | #define G_000044_SCRATCH_INT_STAT(x) (((x) >> 18) & 0x1) | ||
| 120 | #define C_000044_SCRATCH_INT_STAT 0xFFFBFFFF | ||
| 121 | #define S_000044_GUI_IDLE_STAT(x) (((x) & 0x1) << 19) | ||
| 122 | #define G_000044_GUI_IDLE_STAT(x) (((x) >> 19) & 0x1) | ||
| 123 | #define C_000044_GUI_IDLE_STAT 0xFFF7FFFF | ||
| 124 | #define S_000044_ATI_OVERDRIVE_INT_STAT(x) (((x) & 0x1) << 20) | ||
| 125 | #define G_000044_ATI_OVERDRIVE_INT_STAT(x) (((x) >> 20) & 0x1) | ||
| 126 | #define C_000044_ATI_OVERDRIVE_INT_STAT 0xFFEFFFFF | ||
| 127 | #define S_000044_MC_PROTECTION_FAULT_STAT(x) (((x) & 0x1) << 21) | ||
| 128 | #define G_000044_MC_PROTECTION_FAULT_STAT(x) (((x) >> 21) & 0x1) | ||
| 129 | #define C_000044_MC_PROTECTION_FAULT_STAT 0xFFDFFFFF | ||
| 130 | #define S_000044_RBBM_READ_INT_STAT(x) (((x) & 0x1) << 22) | ||
| 131 | #define G_000044_RBBM_READ_INT_STAT(x) (((x) >> 22) & 0x1) | ||
| 132 | #define C_000044_RBBM_READ_INT_STAT 0xFFBFFFFF | ||
| 133 | #define S_000044_CB_CONTEXT_SWITCH_STAT(x) (((x) & 0x1) << 23) | ||
| 134 | #define G_000044_CB_CONTEXT_SWITCH_STAT(x) (((x) >> 23) & 0x1) | ||
| 135 | #define C_000044_CB_CONTEXT_SWITCH_STAT 0xFF7FFFFF | ||
| 136 | #define S_000044_VIPH_INT(x) (((x) & 0x1) << 24) | ||
| 137 | #define G_000044_VIPH_INT(x) (((x) >> 24) & 0x1) | ||
| 138 | #define C_000044_VIPH_INT 0xFEFFFFFF | ||
| 139 | #define S_000044_SW_INT(x) (((x) & 0x1) << 25) | ||
| 140 | #define G_000044_SW_INT(x) (((x) >> 25) & 0x1) | ||
| 141 | #define C_000044_SW_INT 0xFDFFFFFF | ||
| 142 | #define S_000044_SW_INT_SET(x) (((x) & 0x1) << 26) | ||
| 143 | #define G_000044_SW_INT_SET(x) (((x) >> 26) & 0x1) | ||
| 144 | #define C_000044_SW_INT_SET 0xFBFFFFFF | ||
| 145 | #define S_000044_IDCT_INT_STAT(x) (((x) & 0x1) << 27) | ||
| 146 | #define G_000044_IDCT_INT_STAT(x) (((x) >> 27) & 0x1) | ||
| 147 | #define C_000044_IDCT_INT_STAT 0xF7FFFFFF | ||
| 148 | #define S_000044_GUIDMA_STAT(x) (((x) & 0x1) << 30) | ||
| 149 | #define G_000044_GUIDMA_STAT(x) (((x) >> 30) & 0x1) | ||
| 150 | #define C_000044_GUIDMA_STAT 0xBFFFFFFF | ||
| 151 | #define S_000044_VIDDMA_STAT(x) (((x) & 0x1) << 31) | ||
| 152 | #define G_000044_VIDDMA_STAT(x) (((x) >> 31) & 0x1) | ||
| 153 | #define C_000044_VIDDMA_STAT 0x7FFFFFFF | ||
| 154 | #define R_00004C_BUS_CNTL 0x00004C | ||
| 155 | #define S_00004C_BUS_MASTER_DIS(x) (((x) & 0x1) << 14) | ||
| 156 | #define G_00004C_BUS_MASTER_DIS(x) (((x) >> 14) & 0x1) | ||
| 157 | #define C_00004C_BUS_MASTER_DIS 0xFFFFBFFF | ||
| 158 | #define S_00004C_BUS_MSI_REARM(x) (((x) & 0x1) << 20) | ||
| 159 | #define G_00004C_BUS_MSI_REARM(x) (((x) >> 20) & 0x1) | ||
| 160 | #define C_00004C_BUS_MSI_REARM 0xFFEFFFFF | ||
| 161 | #define R_000070_MC_IND_INDEX 0x000070 | ||
| 162 | #define S_000070_MC_IND_ADDR(x) (((x) & 0xFFFF) << 0) | ||
| 163 | #define G_000070_MC_IND_ADDR(x) (((x) >> 0) & 0xFFFF) | ||
| 164 | #define C_000070_MC_IND_ADDR 0xFFFF0000 | ||
| 165 | #define S_000070_MC_IND_SEQ_RBS_0(x) (((x) & 0x1) << 16) | ||
| 166 | #define G_000070_MC_IND_SEQ_RBS_0(x) (((x) >> 16) & 0x1) | ||
| 167 | #define C_000070_MC_IND_SEQ_RBS_0 0xFFFEFFFF | ||
| 168 | #define S_000070_MC_IND_SEQ_RBS_1(x) (((x) & 0x1) << 17) | ||
| 169 | #define G_000070_MC_IND_SEQ_RBS_1(x) (((x) >> 17) & 0x1) | ||
| 170 | #define C_000070_MC_IND_SEQ_RBS_1 0xFFFDFFFF | ||
| 171 | #define S_000070_MC_IND_SEQ_RBS_2(x) (((x) & 0x1) << 18) | ||
| 172 | #define G_000070_MC_IND_SEQ_RBS_2(x) (((x) >> 18) & 0x1) | ||
| 173 | #define C_000070_MC_IND_SEQ_RBS_2 0xFFFBFFFF | ||
| 174 | #define S_000070_MC_IND_SEQ_RBS_3(x) (((x) & 0x1) << 19) | ||
| 175 | #define G_000070_MC_IND_SEQ_RBS_3(x) (((x) >> 19) & 0x1) | ||
| 176 | #define C_000070_MC_IND_SEQ_RBS_3 0xFFF7FFFF | ||
| 177 | #define S_000070_MC_IND_AIC_RBS(x) (((x) & 0x1) << 20) | ||
| 178 | #define G_000070_MC_IND_AIC_RBS(x) (((x) >> 20) & 0x1) | ||
| 179 | #define C_000070_MC_IND_AIC_RBS 0xFFEFFFFF | ||
| 180 | #define S_000070_MC_IND_CITF_ARB0(x) (((x) & 0x1) << 21) | ||
| 181 | #define G_000070_MC_IND_CITF_ARB0(x) (((x) >> 21) & 0x1) | ||
| 182 | #define C_000070_MC_IND_CITF_ARB0 0xFFDFFFFF | ||
| 183 | #define S_000070_MC_IND_CITF_ARB1(x) (((x) & 0x1) << 22) | ||
| 184 | #define G_000070_MC_IND_CITF_ARB1(x) (((x) >> 22) & 0x1) | ||
| 185 | #define C_000070_MC_IND_CITF_ARB1 0xFFBFFFFF | ||
| 186 | #define S_000070_MC_IND_WR_EN(x) (((x) & 0x1) << 23) | ||
| 187 | #define G_000070_MC_IND_WR_EN(x) (((x) >> 23) & 0x1) | ||
| 188 | #define C_000070_MC_IND_WR_EN 0xFF7FFFFF | ||
| 189 | #define S_000070_MC_IND_RD_INV(x) (((x) & 0x1) << 24) | ||
| 190 | #define G_000070_MC_IND_RD_INV(x) (((x) >> 24) & 0x1) | ||
| 191 | #define C_000070_MC_IND_RD_INV 0xFEFFFFFF | ||
| 192 | #define R_000074_MC_IND_DATA 0x000074 | ||
| 193 | #define S_000074_MC_IND_DATA(x) (((x) & 0xFFFFFFFF) << 0) | ||
| 194 | #define G_000074_MC_IND_DATA(x) (((x) >> 0) & 0xFFFFFFFF) | ||
| 195 | #define C_000074_MC_IND_DATA 0x00000000 | ||
| 196 | #define R_000134_HDP_FB_LOCATION 0x000134 | ||
| 197 | #define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 198 | #define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 199 | #define C_000134_HDP_FB_START 0xFFFF0000 | ||
| 200 | #define R_0007C0_CP_STAT 0x0007C0 | ||
| 201 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
| 202 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
| 203 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
| 204 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
| 205 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
| 206 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
| 207 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
| 208 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
| 209 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
| 210 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
| 211 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
| 212 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
| 213 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
| 214 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
| 215 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
| 216 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
| 217 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
| 218 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
| 219 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
| 220 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
| 221 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
| 222 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
| 223 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
| 224 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
| 225 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
| 226 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
| 227 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
| 228 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
| 229 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
| 230 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
| 231 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
| 232 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
| 233 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
| 234 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
| 235 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
| 236 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
| 237 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
| 238 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
| 239 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
| 240 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
| 241 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
| 242 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
| 243 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
| 244 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
| 245 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
| 246 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
| 247 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
| 248 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
| 249 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
| 250 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
| 251 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
| 252 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
| 253 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
| 254 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
| 255 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
| 256 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
| 257 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
| 258 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
| 259 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
| 260 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
| 261 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
| 262 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
| 263 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
| 264 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
| 265 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
| 266 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
| 267 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
| 268 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
| 269 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
| 270 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
| 271 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
| 272 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
| 273 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
| 274 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
| 275 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
| 276 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
| 277 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
| 278 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
| 279 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
| 280 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
| 281 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
| 282 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
| 283 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
| 284 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
| 285 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
| 286 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
| 287 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
| 288 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
| 289 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
| 290 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
| 291 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
| 292 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
| 293 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
| 294 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
| 295 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
| 296 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
| 297 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
| 298 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
| 299 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
| 300 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
| 301 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
| 302 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
| 303 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
| 304 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
| 305 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
| 306 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
| 307 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
| 308 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
| 309 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
| 310 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
| 311 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
| 312 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
| 313 | #define R_0060A4_D1CRTC_STATUS_FRAME_COUNT 0x0060A4 | ||
| 314 | #define S_0060A4_D1CRTC_FRAME_COUNT(x) (((x) & 0xFFFFFF) << 0) | ||
| 315 | #define G_0060A4_D1CRTC_FRAME_COUNT(x) (((x) >> 0) & 0xFFFFFF) | ||
| 316 | #define C_0060A4_D1CRTC_FRAME_COUNT 0xFF000000 | ||
| 317 | #define R_006534_D1MODE_VBLANK_STATUS 0x006534 | ||
| 318 | #define S_006534_D1MODE_VBLANK_OCCURRED(x) (((x) & 0x1) << 0) | ||
| 319 | #define G_006534_D1MODE_VBLANK_OCCURRED(x) (((x) >> 0) & 0x1) | ||
| 320 | #define C_006534_D1MODE_VBLANK_OCCURRED 0xFFFFFFFE | ||
| 321 | #define S_006534_D1MODE_VBLANK_ACK(x) (((x) & 0x1) << 4) | ||
| 322 | #define G_006534_D1MODE_VBLANK_ACK(x) (((x) >> 4) & 0x1) | ||
| 323 | #define C_006534_D1MODE_VBLANK_ACK 0xFFFFFFEF | ||
| 324 | #define S_006534_D1MODE_VBLANK_STAT(x) (((x) & 0x1) << 12) | ||
| 325 | #define G_006534_D1MODE_VBLANK_STAT(x) (((x) >> 12) & 0x1) | ||
| 326 | #define C_006534_D1MODE_VBLANK_STAT 0xFFFFEFFF | ||
| 327 | #define S_006534_D1MODE_VBLANK_INTERRUPT(x) (((x) & 0x1) << 16) | ||
| 328 | #define G_006534_D1MODE_VBLANK_INTERRUPT(x) (((x) >> 16) & 0x1) | ||
| 329 | #define C_006534_D1MODE_VBLANK_INTERRUPT 0xFFFEFFFF | ||
| 330 | #define R_006540_DxMODE_INT_MASK 0x006540 | ||
| 331 | #define S_006540_D1MODE_VBLANK_INT_MASK(x) (((x) & 0x1) << 0) | ||
| 332 | #define G_006540_D1MODE_VBLANK_INT_MASK(x) (((x) >> 0) & 0x1) | ||
| 333 | #define C_006540_D1MODE_VBLANK_INT_MASK 0xFFFFFFFE | ||
| 334 | #define S_006540_D1MODE_VLINE_INT_MASK(x) (((x) & 0x1) << 4) | ||
| 335 | #define G_006540_D1MODE_VLINE_INT_MASK(x) (((x) >> 4) & 0x1) | ||
| 336 | #define C_006540_D1MODE_VLINE_INT_MASK 0xFFFFFFEF | ||
| 337 | #define S_006540_D2MODE_VBLANK_INT_MASK(x) (((x) & 0x1) << 8) | ||
| 338 | #define G_006540_D2MODE_VBLANK_INT_MASK(x) (((x) >> 8) & 0x1) | ||
| 339 | #define C_006540_D2MODE_VBLANK_INT_MASK 0xFFFFFEFF | ||
| 340 | #define S_006540_D2MODE_VLINE_INT_MASK(x) (((x) & 0x1) << 12) | ||
| 341 | #define G_006540_D2MODE_VLINE_INT_MASK(x) (((x) >> 12) & 0x1) | ||
| 342 | #define C_006540_D2MODE_VLINE_INT_MASK 0xFFFFEFFF | ||
| 343 | #define S_006540_D1MODE_VBLANK_CP_SEL(x) (((x) & 0x1) << 30) | ||
| 344 | #define G_006540_D1MODE_VBLANK_CP_SEL(x) (((x) >> 30) & 0x1) | ||
| 345 | #define C_006540_D1MODE_VBLANK_CP_SEL 0xBFFFFFFF | ||
| 346 | #define S_006540_D2MODE_VBLANK_CP_SEL(x) (((x) & 0x1) << 31) | ||
| 347 | #define G_006540_D2MODE_VBLANK_CP_SEL(x) (((x) >> 31) & 0x1) | ||
| 348 | #define C_006540_D2MODE_VBLANK_CP_SEL 0x7FFFFFFF | ||
| 349 | #define R_0068A4_D2CRTC_STATUS_FRAME_COUNT 0x0068A4 | ||
| 350 | #define S_0068A4_D2CRTC_FRAME_COUNT(x) (((x) & 0xFFFFFF) << 0) | ||
| 351 | #define G_0068A4_D2CRTC_FRAME_COUNT(x) (((x) >> 0) & 0xFFFFFF) | ||
| 352 | #define C_0068A4_D2CRTC_FRAME_COUNT 0xFF000000 | ||
| 353 | #define R_006D34_D2MODE_VBLANK_STATUS 0x006D34 | ||
| 354 | #define S_006D34_D2MODE_VBLANK_OCCURRED(x) (((x) & 0x1) << 0) | ||
| 355 | #define G_006D34_D2MODE_VBLANK_OCCURRED(x) (((x) >> 0) & 0x1) | ||
| 356 | #define C_006D34_D2MODE_VBLANK_OCCURRED 0xFFFFFFFE | ||
| 357 | #define S_006D34_D2MODE_VBLANK_ACK(x) (((x) & 0x1) << 4) | ||
| 358 | #define G_006D34_D2MODE_VBLANK_ACK(x) (((x) >> 4) & 0x1) | ||
| 359 | #define C_006D34_D2MODE_VBLANK_ACK 0xFFFFFFEF | ||
| 360 | #define S_006D34_D2MODE_VBLANK_STAT(x) (((x) & 0x1) << 12) | ||
| 361 | #define G_006D34_D2MODE_VBLANK_STAT(x) (((x) >> 12) & 0x1) | ||
| 362 | #define C_006D34_D2MODE_VBLANK_STAT 0xFFFFEFFF | ||
| 363 | #define S_006D34_D2MODE_VBLANK_INTERRUPT(x) (((x) & 0x1) << 16) | ||
| 364 | #define G_006D34_D2MODE_VBLANK_INTERRUPT(x) (((x) >> 16) & 0x1) | ||
| 365 | #define C_006D34_D2MODE_VBLANK_INTERRUPT 0xFFFEFFFF | ||
| 366 | #define R_007EDC_DISP_INTERRUPT_STATUS 0x007EDC | ||
| 367 | #define S_007EDC_LB_D1_VBLANK_INTERRUPT(x) (((x) & 0x1) << 4) | ||
| 368 | #define G_007EDC_LB_D1_VBLANK_INTERRUPT(x) (((x) >> 4) & 0x1) | ||
| 369 | #define C_007EDC_LB_D1_VBLANK_INTERRUPT 0xFFFFFFEF | ||
| 370 | #define S_007EDC_LB_D2_VBLANK_INTERRUPT(x) (((x) & 0x1) << 5) | ||
| 371 | #define G_007EDC_LB_D2_VBLANK_INTERRUPT(x) (((x) >> 5) & 0x1) | ||
| 372 | #define C_007EDC_LB_D2_VBLANK_INTERRUPT 0xFFFFFFDF | ||
| 373 | |||
| 374 | |||
| 375 | /* MC registers */ | ||
| 376 | #define R_000000_MC_STATUS 0x000000 | ||
| 377 | #define S_000000_MC_IDLE(x) (((x) & 0x1) << 0) | ||
| 378 | #define G_000000_MC_IDLE(x) (((x) >> 0) & 0x1) | ||
| 379 | #define C_000000_MC_IDLE 0xFFFFFFFE | ||
| 380 | #define R_000004_MC_FB_LOCATION 0x000004 | ||
| 381 | #define S_000004_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 382 | #define G_000004_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 383 | #define C_000004_MC_FB_START 0xFFFF0000 | ||
| 384 | #define S_000004_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 385 | #define G_000004_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 386 | #define C_000004_MC_FB_TOP 0x0000FFFF | ||
| 387 | #define R_000005_MC_AGP_LOCATION 0x000005 | ||
| 388 | #define S_000005_MC_AGP_START(x) (((x) & 0xFFFF) << 0) | ||
| 389 | #define G_000005_MC_AGP_START(x) (((x) >> 0) & 0xFFFF) | ||
| 390 | #define C_000005_MC_AGP_START 0xFFFF0000 | ||
| 391 | #define S_000005_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 392 | #define G_000005_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 393 | #define C_000005_MC_AGP_TOP 0x0000FFFF | ||
| 394 | #define R_000006_AGP_BASE 0x000006 | ||
| 395 | #define S_000006_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | ||
| 396 | #define G_000006_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | ||
| 397 | #define C_000006_AGP_BASE_ADDR 0x00000000 | ||
| 398 | #define R_000007_AGP_BASE_2 0x000007 | ||
| 399 | #define S_000007_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0) | ||
| 400 | #define G_000007_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF) | ||
| 401 | #define C_000007_AGP_BASE_ADDR_2 0xFFFFFFF0 | ||
| 402 | #define R_000009_MC_CNTL1 0x000009 | ||
| 403 | #define S_000009_ENABLE_PAGE_TABLES(x) (((x) & 0x1) << 26) | ||
| 404 | #define G_000009_ENABLE_PAGE_TABLES(x) (((x) >> 26) & 0x1) | ||
| 405 | #define C_000009_ENABLE_PAGE_TABLES 0xFBFFFFFF | ||
| 406 | /* FIXME don't know the various field size need feedback from AMD */ | ||
| 407 | #define R_000100_MC_PT0_CNTL 0x000100 | ||
| 408 | #define S_000100_ENABLE_PT(x) (((x) & 0x1) << 0) | ||
| 409 | #define G_000100_ENABLE_PT(x) (((x) >> 0) & 0x1) | ||
| 410 | #define C_000100_ENABLE_PT 0xFFFFFFFE | ||
| 411 | #define S_000100_EFFECTIVE_L2_CACHE_SIZE(x) (((x) & 0x7) << 15) | ||
| 412 | #define G_000100_EFFECTIVE_L2_CACHE_SIZE(x) (((x) >> 15) & 0x7) | ||
| 413 | #define C_000100_EFFECTIVE_L2_CACHE_SIZE 0xFFFC7FFF | ||
| 414 | #define S_000100_EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 0x7) << 21) | ||
| 415 | #define G_000100_EFFECTIVE_L2_QUEUE_SIZE(x) (((x) >> 21) & 0x7) | ||
| 416 | #define C_000100_EFFECTIVE_L2_QUEUE_SIZE 0xFF1FFFFF | ||
| 417 | #define S_000100_INVALIDATE_ALL_L1_TLBS(x) (((x) & 0x1) << 28) | ||
| 418 | #define G_000100_INVALIDATE_ALL_L1_TLBS(x) (((x) >> 28) & 0x1) | ||
| 419 | #define C_000100_INVALIDATE_ALL_L1_TLBS 0xEFFFFFFF | ||
| 420 | #define S_000100_INVALIDATE_L2_CACHE(x) (((x) & 0x1) << 29) | ||
| 421 | #define G_000100_INVALIDATE_L2_CACHE(x) (((x) >> 29) & 0x1) | ||
| 422 | #define C_000100_INVALIDATE_L2_CACHE 0xDFFFFFFF | ||
| 423 | #define R_000102_MC_PT0_CONTEXT0_CNTL 0x000102 | ||
| 424 | #define S_000102_ENABLE_PAGE_TABLE(x) (((x) & 0x1) << 0) | ||
| 425 | #define G_000102_ENABLE_PAGE_TABLE(x) (((x) >> 0) & 0x1) | ||
| 426 | #define C_000102_ENABLE_PAGE_TABLE 0xFFFFFFFE | ||
| 427 | #define S_000102_PAGE_TABLE_DEPTH(x) (((x) & 0x3) << 1) | ||
| 428 | #define G_000102_PAGE_TABLE_DEPTH(x) (((x) >> 1) & 0x3) | ||
| 429 | #define C_000102_PAGE_TABLE_DEPTH 0xFFFFFFF9 | ||
| 430 | #define V_000102_PAGE_TABLE_FLAT 0 | ||
| 431 | /* R600 documentation suggest that this should be a number of pages */ | ||
| 432 | #define R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR 0x000112 | ||
| 433 | #define R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR 0x000114 | ||
| 434 | #define R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR 0x00011C | ||
| 435 | #define R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR 0x00012C | ||
| 436 | #define R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR 0x00013C | ||
| 437 | #define R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR 0x00014C | ||
| 438 | #define R_00016C_MC_PT0_CLIENT0_CNTL 0x00016C | ||
| 439 | #define S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(x) (((x) & 0x1) << 0) | ||
| 440 | #define G_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(x) (((x) >> 0) & 0x1) | ||
| 441 | #define C_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE 0xFFFFFFFE | ||
| 442 | #define S_00016C_TRANSLATION_MODE_OVERRIDE(x) (((x) & 0x1) << 1) | ||
| 443 | #define G_00016C_TRANSLATION_MODE_OVERRIDE(x) (((x) >> 1) & 0x1) | ||
| 444 | #define C_00016C_TRANSLATION_MODE_OVERRIDE 0xFFFFFFFD | ||
| 445 | #define S_00016C_SYSTEM_ACCESS_MODE_MASK(x) (((x) & 0x3) << 8) | ||
| 446 | #define G_00016C_SYSTEM_ACCESS_MODE_MASK(x) (((x) >> 8) & 0x3) | ||
| 447 | #define C_00016C_SYSTEM_ACCESS_MODE_MASK 0xFFFFFCFF | ||
| 448 | #define V_00016C_SYSTEM_ACCESS_MODE_PA_ONLY 0 | ||
| 449 | #define V_00016C_SYSTEM_ACCESS_MODE_USE_SYS_MAP 1 | ||
| 450 | #define V_00016C_SYSTEM_ACCESS_MODE_IN_SYS 2 | ||
| 451 | #define V_00016C_SYSTEM_ACCESS_MODE_NOT_IN_SYS 3 | ||
| 452 | #define S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(x) (((x) & 0x1) << 10) | ||
| 453 | #define G_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(x) (((x) >> 10) & 0x1) | ||
| 454 | #define C_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS 0xFFFFFBFF | ||
| 455 | #define V_00016C_SYSTEM_APERTURE_UNMAPPED_PASSTHROUGH 0 | ||
| 456 | #define V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE 1 | ||
| 457 | #define S_00016C_EFFECTIVE_L1_CACHE_SIZE(x) (((x) & 0x7) << 11) | ||
| 458 | #define G_00016C_EFFECTIVE_L1_CACHE_SIZE(x) (((x) >> 11) & 0x7) | ||
| 459 | #define C_00016C_EFFECTIVE_L1_CACHE_SIZE 0xFFFFC7FF | ||
| 460 | #define S_00016C_ENABLE_FRAGMENT_PROCESSING(x) (((x) & 0x1) << 14) | ||
| 461 | #define G_00016C_ENABLE_FRAGMENT_PROCESSING(x) (((x) >> 14) & 0x1) | ||
| 462 | #define C_00016C_ENABLE_FRAGMENT_PROCESSING 0xFFFFBFFF | ||
| 463 | #define S_00016C_EFFECTIVE_L1_QUEUE_SIZE(x) (((x) & 0x7) << 15) | ||
| 464 | #define G_00016C_EFFECTIVE_L1_QUEUE_SIZE(x) (((x) >> 15) & 0x7) | ||
| 465 | #define C_00016C_EFFECTIVE_L1_QUEUE_SIZE 0xFFFC7FFF | ||
| 466 | #define S_00016C_INVALIDATE_L1_TLB(x) (((x) & 0x1) << 20) | ||
| 467 | #define G_00016C_INVALIDATE_L1_TLB(x) (((x) >> 20) & 0x1) | ||
| 468 | #define C_00016C_INVALIDATE_L1_TLB 0xFFEFFFFF | ||
| 469 | |||
| 470 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 7a0098ddf977..025e3225346c 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -26,105 +26,29 @@ | |||
| 26 | * Jerome Glisse | 26 | * Jerome Glisse |
| 27 | */ | 27 | */ |
| 28 | #include "drmP.h" | 28 | #include "drmP.h" |
| 29 | #include "radeon_reg.h" | ||
| 30 | #include "radeon.h" | 29 | #include "radeon.h" |
| 31 | #include "rs690r.h" | ||
| 32 | #include "atom.h" | 30 | #include "atom.h" |
| 33 | #include "atom-bits.h" | 31 | #include "rs690d.h" |
| 34 | |||
| 35 | /* rs690,rs740 depends on : */ | ||
| 36 | void r100_hdp_reset(struct radeon_device *rdev); | ||
| 37 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 38 | void r420_pipes_init(struct radeon_device *rdev); | ||
| 39 | void rs400_gart_disable(struct radeon_device *rdev); | ||
| 40 | int rs400_gart_enable(struct radeon_device *rdev); | ||
| 41 | void rs400_gart_adjust_size(struct radeon_device *rdev); | ||
| 42 | void rs600_mc_disable_clients(struct radeon_device *rdev); | ||
| 43 | |||
| 44 | /* This files gather functions specifics to : | ||
| 45 | * rs690,rs740 | ||
| 46 | * | ||
| 47 | * Some of these functions might be used by newer ASICs. | ||
| 48 | */ | ||
| 49 | void rs690_gpu_init(struct radeon_device *rdev); | ||
| 50 | int rs690_mc_wait_for_idle(struct radeon_device *rdev); | ||
| 51 | |||
| 52 | |||
| 53 | /* | ||
| 54 | * MC functions. | ||
| 55 | */ | ||
| 56 | int rs690_mc_init(struct radeon_device *rdev) | ||
| 57 | { | ||
| 58 | uint32_t tmp; | ||
| 59 | int r; | ||
| 60 | |||
| 61 | if (r100_debugfs_rbbm_init(rdev)) { | ||
| 62 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
| 63 | } | ||
| 64 | |||
| 65 | rs690_gpu_init(rdev); | ||
| 66 | rs400_gart_disable(rdev); | ||
| 67 | |||
| 68 | /* Setup GPU memory space */ | ||
| 69 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
| 70 | rdev->mc.gtt_location += (rdev->mc.gtt_size - 1); | ||
| 71 | rdev->mc.gtt_location &= ~(rdev->mc.gtt_size - 1); | ||
| 72 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
| 73 | r = radeon_mc_setup(rdev); | ||
| 74 | if (r) { | ||
| 75 | return r; | ||
| 76 | } | ||
| 77 | |||
| 78 | /* Program GPU memory space */ | ||
| 79 | rs600_mc_disable_clients(rdev); | ||
| 80 | if (rs690_mc_wait_for_idle(rdev)) { | ||
| 81 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
| 82 | "programming pipes. Bad things might happen.\n"); | ||
| 83 | } | ||
| 84 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
| 85 | tmp = REG_SET(RS690_MC_FB_TOP, tmp >> 16); | ||
| 86 | tmp |= REG_SET(RS690_MC_FB_START, rdev->mc.vram_location >> 16); | ||
| 87 | WREG32_MC(RS690_MCCFG_FB_LOCATION, tmp); | ||
| 88 | /* FIXME: Does this reg exist on RS480,RS740 ? */ | ||
| 89 | WREG32(0x310, rdev->mc.vram_location); | ||
| 90 | WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16); | ||
| 91 | return 0; | ||
| 92 | } | ||
| 93 | |||
| 94 | void rs690_mc_fini(struct radeon_device *rdev) | ||
| 95 | { | ||
| 96 | } | ||
| 97 | |||
| 98 | 32 | ||
| 99 | /* | 33 | static int rs690_mc_wait_for_idle(struct radeon_device *rdev) |
| 100 | * Global GPU functions | ||
| 101 | */ | ||
| 102 | int rs690_mc_wait_for_idle(struct radeon_device *rdev) | ||
| 103 | { | 34 | { |
| 104 | unsigned i; | 35 | unsigned i; |
| 105 | uint32_t tmp; | 36 | uint32_t tmp; |
| 106 | 37 | ||
| 107 | for (i = 0; i < rdev->usec_timeout; i++) { | 38 | for (i = 0; i < rdev->usec_timeout; i++) { |
| 108 | /* read MC_STATUS */ | 39 | /* read MC_STATUS */ |
| 109 | tmp = RREG32_MC(RS690_MC_STATUS); | 40 | tmp = RREG32_MC(R_000090_MC_SYSTEM_STATUS); |
| 110 | if (tmp & RS690_MC_STATUS_IDLE) { | 41 | if (G_000090_MC_SYSTEM_IDLE(tmp)) |
| 111 | return 0; | 42 | return 0; |
| 112 | } | 43 | udelay(1); |
| 113 | DRM_UDELAY(1); | ||
| 114 | } | 44 | } |
| 115 | return -1; | 45 | return -1; |
| 116 | } | 46 | } |
| 117 | 47 | ||
| 118 | void rs690_errata(struct radeon_device *rdev) | 48 | static void rs690_gpu_init(struct radeon_device *rdev) |
| 119 | { | ||
| 120 | rdev->pll_errata = 0; | ||
| 121 | } | ||
| 122 | |||
| 123 | void rs690_gpu_init(struct radeon_device *rdev) | ||
| 124 | { | 49 | { |
| 125 | /* FIXME: HDP same place on rs690 ? */ | 50 | /* FIXME: HDP same place on rs690 ? */ |
| 126 | r100_hdp_reset(rdev); | 51 | r100_hdp_reset(rdev); |
| 127 | rv515_vga_render_disable(rdev); | ||
| 128 | /* FIXME: is this correct ? */ | 52 | /* FIXME: is this correct ? */ |
| 129 | r420_pipes_init(rdev); | 53 | r420_pipes_init(rdev); |
| 130 | if (rs690_mc_wait_for_idle(rdev)) { | 54 | if (rs690_mc_wait_for_idle(rdev)) { |
| @@ -133,10 +57,6 @@ void rs690_gpu_init(struct radeon_device *rdev) | |||
| 133 | } | 57 | } |
| 134 | } | 58 | } |
| 135 | 59 | ||
| 136 | |||
| 137 | /* | ||
| 138 | * VRAM info. | ||
| 139 | */ | ||
| 140 | void rs690_pm_info(struct radeon_device *rdev) | 60 | void rs690_pm_info(struct radeon_device *rdev) |
| 141 | { | 61 | { |
| 142 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); | 62 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); |
| @@ -250,39 +170,39 @@ void rs690_line_buffer_adjust(struct radeon_device *rdev, | |||
| 250 | /* | 170 | /* |
| 251 | * Line Buffer Setup | 171 | * Line Buffer Setup |
| 252 | * There is a single line buffer shared by both display controllers. | 172 | * There is a single line buffer shared by both display controllers. |
| 253 | * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between | 173 | * R_006520_DC_LB_MEMORY_SPLIT controls how that line buffer is shared between |
| 254 | * the display controllers. The paritioning can either be done | 174 | * the display controllers. The paritioning can either be done |
| 255 | * manually or via one of four preset allocations specified in bits 1:0: | 175 | * manually or via one of four preset allocations specified in bits 1:0: |
| 256 | * 0 - line buffer is divided in half and shared between crtc | 176 | * 0 - line buffer is divided in half and shared between crtc |
| 257 | * 1 - D1 gets 3/4 of the line buffer, D2 gets 1/4 | 177 | * 1 - D1 gets 3/4 of the line buffer, D2 gets 1/4 |
| 258 | * 2 - D1 gets the whole buffer | 178 | * 2 - D1 gets the whole buffer |
| 259 | * 3 - D1 gets 1/4 of the line buffer, D2 gets 3/4 | 179 | * 3 - D1 gets 1/4 of the line buffer, D2 gets 3/4 |
| 260 | * Setting bit 2 of DC_LB_MEMORY_SPLIT controls switches to manual | 180 | * Setting bit 2 of R_006520_DC_LB_MEMORY_SPLIT controls switches to manual |
| 261 | * allocation mode. In manual allocation mode, D1 always starts at 0, | 181 | * allocation mode. In manual allocation mode, D1 always starts at 0, |
| 262 | * D1 end/2 is specified in bits 14:4; D2 allocation follows D1. | 182 | * D1 end/2 is specified in bits 14:4; D2 allocation follows D1. |
| 263 | */ | 183 | */ |
| 264 | tmp = RREG32(DC_LB_MEMORY_SPLIT) & ~DC_LB_MEMORY_SPLIT_MASK; | 184 | tmp = RREG32(R_006520_DC_LB_MEMORY_SPLIT) & C_006520_DC_LB_MEMORY_SPLIT; |
| 265 | tmp &= ~DC_LB_MEMORY_SPLIT_SHIFT_MODE; | 185 | tmp &= ~C_006520_DC_LB_MEMORY_SPLIT_MODE; |
| 266 | /* auto */ | 186 | /* auto */ |
| 267 | if (mode1 && mode2) { | 187 | if (mode1 && mode2) { |
| 268 | if (mode1->hdisplay > mode2->hdisplay) { | 188 | if (mode1->hdisplay > mode2->hdisplay) { |
| 269 | if (mode1->hdisplay > 2560) | 189 | if (mode1->hdisplay > 2560) |
| 270 | tmp |= DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q; | 190 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q; |
| 271 | else | 191 | else |
| 272 | tmp |= DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; | 192 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; |
| 273 | } else if (mode2->hdisplay > mode1->hdisplay) { | 193 | } else if (mode2->hdisplay > mode1->hdisplay) { |
| 274 | if (mode2->hdisplay > 2560) | 194 | if (mode2->hdisplay > 2560) |
| 275 | tmp |= DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; | 195 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; |
| 276 | else | 196 | else |
| 277 | tmp |= DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; | 197 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; |
| 278 | } else | 198 | } else |
| 279 | tmp |= AVIVO_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; | 199 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; |
| 280 | } else if (mode1) { | 200 | } else if (mode1) { |
| 281 | tmp |= DC_LB_MEMORY_SPLIT_D1_ONLY; | 201 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_ONLY; |
| 282 | } else if (mode2) { | 202 | } else if (mode2) { |
| 283 | tmp |= DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; | 203 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; |
| 284 | } | 204 | } |
| 285 | WREG32(DC_LB_MEMORY_SPLIT, tmp); | 205 | WREG32(R_006520_DC_LB_MEMORY_SPLIT, tmp); |
| 286 | } | 206 | } |
| 287 | 207 | ||
| 288 | struct rs690_watermark { | 208 | struct rs690_watermark { |
| @@ -487,28 +407,28 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 487 | * option. | 407 | * option. |
| 488 | */ | 408 | */ |
| 489 | if (rdev->disp_priority == 2) { | 409 | if (rdev->disp_priority == 2) { |
| 490 | tmp = RREG32_MC(MC_INIT_MISC_LAT_TIMER); | 410 | tmp = RREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER); |
| 491 | tmp &= ~MC_DISP1R_INIT_LAT_MASK; | 411 | tmp &= C_000104_MC_DISP0R_INIT_LAT; |
| 492 | tmp &= ~MC_DISP0R_INIT_LAT_MASK; | 412 | tmp &= C_000104_MC_DISP1R_INIT_LAT; |
| 493 | if (mode1) | ||
| 494 | tmp |= (1 << MC_DISP1R_INIT_LAT_SHIFT); | ||
| 495 | if (mode0) | 413 | if (mode0) |
| 496 | tmp |= (1 << MC_DISP0R_INIT_LAT_SHIFT); | 414 | tmp |= S_000104_MC_DISP0R_INIT_LAT(1); |
| 497 | WREG32_MC(MC_INIT_MISC_LAT_TIMER, tmp); | 415 | if (mode1) |
| 416 | tmp |= S_000104_MC_DISP1R_INIT_LAT(1); | ||
| 417 | WREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER, tmp); | ||
| 498 | } | 418 | } |
| 499 | rs690_line_buffer_adjust(rdev, mode0, mode1); | 419 | rs690_line_buffer_adjust(rdev, mode0, mode1); |
| 500 | 420 | ||
| 501 | if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) | 421 | if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) |
| 502 | WREG32(DCP_CONTROL, 0); | 422 | WREG32(R_006C9C_DCP_CONTROL, 0); |
| 503 | if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880)) | 423 | if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880)) |
| 504 | WREG32(DCP_CONTROL, 2); | 424 | WREG32(R_006C9C_DCP_CONTROL, 2); |
| 505 | 425 | ||
| 506 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[0], &wm0); | 426 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[0], &wm0); |
| 507 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[1], &wm1); | 427 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[1], &wm1); |
| 508 | 428 | ||
| 509 | tmp = (wm0.lb_request_fifo_depth - 1); | 429 | tmp = (wm0.lb_request_fifo_depth - 1); |
| 510 | tmp |= (wm1.lb_request_fifo_depth - 1) << 16; | 430 | tmp |= (wm1.lb_request_fifo_depth - 1) << 16; |
| 511 | WREG32(LB_MAX_REQ_OUTSTANDING, tmp); | 431 | WREG32(R_006D58_LB_MAX_REQ_OUTSTANDING, tmp); |
| 512 | 432 | ||
| 513 | if (mode0 && mode1) { | 433 | if (mode0 && mode1) { |
| 514 | if (rfixed_trunc(wm0.dbpp) > 64) | 434 | if (rfixed_trunc(wm0.dbpp) > 64) |
| @@ -561,10 +481,10 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 561 | priority_mark12.full = 0; | 481 | priority_mark12.full = 0; |
| 562 | if (wm1.priority_mark_max.full > priority_mark12.full) | 482 | if (wm1.priority_mark_max.full > priority_mark12.full) |
| 563 | priority_mark12.full = wm1.priority_mark_max.full; | 483 | priority_mark12.full = wm1.priority_mark_max.full; |
| 564 | WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); | 484 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); |
| 565 | WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); | 485 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); |
| 566 | WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); | 486 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); |
| 567 | WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); | 487 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); |
| 568 | } else if (mode0) { | 488 | } else if (mode0) { |
| 569 | if (rfixed_trunc(wm0.dbpp) > 64) | 489 | if (rfixed_trunc(wm0.dbpp) > 64) |
| 570 | a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair); | 490 | a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair); |
| @@ -591,10 +511,12 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 591 | priority_mark02.full = 0; | 511 | priority_mark02.full = 0; |
| 592 | if (wm0.priority_mark_max.full > priority_mark02.full) | 512 | if (wm0.priority_mark_max.full > priority_mark02.full) |
| 593 | priority_mark02.full = wm0.priority_mark_max.full; | 513 | priority_mark02.full = wm0.priority_mark_max.full; |
| 594 | WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); | 514 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); |
| 595 | WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); | 515 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); |
| 596 | WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); | 516 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, |
| 597 | WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); | 517 | S_006D48_D2MODE_PRIORITY_A_OFF(1)); |
| 518 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, | ||
| 519 | S_006D4C_D2MODE_PRIORITY_B_OFF(1)); | ||
| 598 | } else { | 520 | } else { |
| 599 | if (rfixed_trunc(wm1.dbpp) > 64) | 521 | if (rfixed_trunc(wm1.dbpp) > 64) |
| 600 | a.full = rfixed_mul(wm1.dbpp, wm1.num_line_pair); | 522 | a.full = rfixed_mul(wm1.dbpp, wm1.num_line_pair); |
| @@ -621,30 +543,203 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
| 621 | priority_mark12.full = 0; | 543 | priority_mark12.full = 0; |
| 622 | if (wm1.priority_mark_max.full > priority_mark12.full) | 544 | if (wm1.priority_mark_max.full > priority_mark12.full) |
| 623 | priority_mark12.full = wm1.priority_mark_max.full; | 545 | priority_mark12.full = wm1.priority_mark_max.full; |
| 624 | WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); | 546 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, |
| 625 | WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); | 547 | S_006548_D1MODE_PRIORITY_A_OFF(1)); |
| 626 | WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); | 548 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, |
| 627 | WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); | 549 | S_00654C_D1MODE_PRIORITY_B_OFF(1)); |
| 550 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); | ||
| 551 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); | ||
| 628 | } | 552 | } |
| 629 | } | 553 | } |
| 630 | 554 | ||
| 631 | /* | ||
| 632 | * Indirect registers accessor | ||
| 633 | */ | ||
| 634 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 555 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
| 635 | { | 556 | { |
| 636 | uint32_t r; | 557 | uint32_t r; |
| 637 | 558 | ||
| 638 | WREG32(RS690_MC_INDEX, (reg & RS690_MC_INDEX_MASK)); | 559 | WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg)); |
| 639 | r = RREG32(RS690_MC_DATA); | 560 | r = RREG32(R_00007C_MC_DATA); |
| 640 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_MASK); | 561 | WREG32(R_000078_MC_INDEX, ~C_000078_MC_IND_ADDR); |
| 641 | return r; | 562 | return r; |
| 642 | } | 563 | } |
| 643 | 564 | ||
| 644 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | 565 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) |
| 645 | { | 566 | { |
| 646 | WREG32(RS690_MC_INDEX, | 567 | WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg) | |
| 647 | RS690_MC_INDEX_WR_EN | ((reg) & RS690_MC_INDEX_MASK)); | 568 | S_000078_MC_IND_WR_EN(1)); |
| 648 | WREG32(RS690_MC_DATA, v); | 569 | WREG32(R_00007C_MC_DATA, v); |
| 649 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); | 570 | WREG32(R_000078_MC_INDEX, 0x7F); |
| 571 | } | ||
| 572 | |||
| 573 | void rs690_mc_program(struct radeon_device *rdev) | ||
| 574 | { | ||
| 575 | struct rv515_mc_save save; | ||
| 576 | |||
| 577 | /* Stops all mc clients */ | ||
| 578 | rv515_mc_stop(rdev, &save); | ||
| 579 | |||
| 580 | /* Wait for mc idle */ | ||
| 581 | if (rs690_mc_wait_for_idle(rdev)) | ||
| 582 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
| 583 | /* Program MC, should be a 32bits limited address space */ | ||
| 584 | WREG32_MC(R_000100_MCCFG_FB_LOCATION, | ||
| 585 | S_000100_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
| 586 | S_000100_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
| 587 | WREG32(R_000134_HDP_FB_LOCATION, | ||
| 588 | S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | ||
| 589 | |||
| 590 | rv515_mc_resume(rdev, &save); | ||
| 591 | } | ||
| 592 | |||
| 593 | static int rs690_startup(struct radeon_device *rdev) | ||
| 594 | { | ||
| 595 | int r; | ||
| 596 | |||
| 597 | rs690_mc_program(rdev); | ||
| 598 | /* Resume clock */ | ||
| 599 | rv515_clock_startup(rdev); | ||
| 600 | /* Initialize GPU configuration (# pipes, ...) */ | ||
| 601 | rs690_gpu_init(rdev); | ||
| 602 | /* Initialize GART (initialize after TTM so we can allocate | ||
| 603 | * memory through TTM but finalize after TTM) */ | ||
| 604 | r = rs400_gart_enable(rdev); | ||
| 605 | if (r) | ||
| 606 | return r; | ||
| 607 | /* Enable IRQ */ | ||
| 608 | rdev->irq.sw_int = true; | ||
| 609 | rs600_irq_set(rdev); | ||
| 610 | /* 1M ring buffer */ | ||
| 611 | r = r100_cp_init(rdev, 1024 * 1024); | ||
| 612 | if (r) { | ||
| 613 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
| 614 | return r; | ||
| 615 | } | ||
| 616 | r = r100_wb_init(rdev); | ||
| 617 | if (r) | ||
| 618 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
| 619 | r = r100_ib_init(rdev); | ||
| 620 | if (r) { | ||
| 621 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
| 622 | return r; | ||
| 623 | } | ||
| 624 | return 0; | ||
| 625 | } | ||
| 626 | |||
| 627 | int rs690_resume(struct radeon_device *rdev) | ||
| 628 | { | ||
| 629 | /* Make sur GART are not working */ | ||
| 630 | rs400_gart_disable(rdev); | ||
| 631 | /* Resume clock before doing reset */ | ||
| 632 | rv515_clock_startup(rdev); | ||
| 633 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 634 | if (radeon_gpu_reset(rdev)) { | ||
| 635 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 636 | RREG32(R_000E40_RBBM_STATUS), | ||
| 637 | RREG32(R_0007C0_CP_STAT)); | ||
| 638 | } | ||
| 639 | /* post */ | ||
| 640 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 641 | /* Resume clock after posting */ | ||
| 642 | rv515_clock_startup(rdev); | ||
| 643 | return rs690_startup(rdev); | ||
| 644 | } | ||
| 645 | |||
| 646 | int rs690_suspend(struct radeon_device *rdev) | ||
| 647 | { | ||
| 648 | r100_cp_disable(rdev); | ||
| 649 | r100_wb_disable(rdev); | ||
| 650 | rs600_irq_disable(rdev); | ||
| 651 | rs400_gart_disable(rdev); | ||
| 652 | return 0; | ||
| 653 | } | ||
| 654 | |||
| 655 | void rs690_fini(struct radeon_device *rdev) | ||
| 656 | { | ||
| 657 | rs690_suspend(rdev); | ||
| 658 | r100_cp_fini(rdev); | ||
| 659 | r100_wb_fini(rdev); | ||
| 660 | r100_ib_fini(rdev); | ||
| 661 | radeon_gem_fini(rdev); | ||
| 662 | rs400_gart_fini(rdev); | ||
| 663 | radeon_irq_kms_fini(rdev); | ||
| 664 | radeon_fence_driver_fini(rdev); | ||
| 665 | radeon_object_fini(rdev); | ||
| 666 | radeon_atombios_fini(rdev); | ||
| 667 | kfree(rdev->bios); | ||
| 668 | rdev->bios = NULL; | ||
| 669 | } | ||
| 670 | |||
| 671 | int rs690_init(struct radeon_device *rdev) | ||
| 672 | { | ||
| 673 | int r; | ||
| 674 | |||
| 675 | /* Disable VGA */ | ||
| 676 | rv515_vga_render_disable(rdev); | ||
| 677 | /* Initialize scratch registers */ | ||
| 678 | radeon_scratch_init(rdev); | ||
| 679 | /* Initialize surface registers */ | ||
| 680 | radeon_surface_init(rdev); | ||
| 681 | /* TODO: disable VGA need to use VGA request */ | ||
| 682 | /* BIOS*/ | ||
| 683 | if (!radeon_get_bios(rdev)) { | ||
| 684 | if (ASIC_IS_AVIVO(rdev)) | ||
| 685 | return -EINVAL; | ||
| 686 | } | ||
| 687 | if (rdev->is_atom_bios) { | ||
| 688 | r = radeon_atombios_init(rdev); | ||
| 689 | if (r) | ||
| 690 | return r; | ||
| 691 | } else { | ||
| 692 | dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n"); | ||
| 693 | return -EINVAL; | ||
| 694 | } | ||
| 695 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
| 696 | if (radeon_gpu_reset(rdev)) { | ||
| 697 | dev_warn(rdev->dev, | ||
| 698 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
| 699 | RREG32(R_000E40_RBBM_STATUS), | ||
| 700 | RREG32(R_0007C0_CP_STAT)); | ||
| 701 | } | ||
| 702 | /* check if cards are posted or not */ | ||
| 703 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
| 704 | DRM_INFO("GPU not posted. posting now...\n"); | ||
| 705 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 706 | } | ||
| 707 | /* Initialize clocks */ | ||
| 708 | radeon_get_clock_info(rdev->ddev); | ||
| 709 | /* Get vram informations */ | ||
| 710 | rs690_vram_info(rdev); | ||
| 711 | /* Initialize memory controller (also test AGP) */ | ||
| 712 | r = r420_mc_init(rdev); | ||
| 713 | if (r) | ||
| 714 | return r; | ||
| 715 | rv515_debugfs(rdev); | ||
| 716 | /* Fence driver */ | ||
| 717 | r = radeon_fence_driver_init(rdev); | ||
| 718 | if (r) | ||
| 719 | return r; | ||
| 720 | r = radeon_irq_kms_init(rdev); | ||
| 721 | if (r) | ||
| 722 | return r; | ||
| 723 | /* Memory manager */ | ||
| 724 | r = radeon_object_init(rdev); | ||
| 725 | if (r) | ||
| 726 | return r; | ||
| 727 | r = rs400_gart_init(rdev); | ||
| 728 | if (r) | ||
| 729 | return r; | ||
| 730 | rs600_set_safe_registers(rdev); | ||
| 731 | rdev->accel_working = true; | ||
| 732 | r = rs690_startup(rdev); | ||
| 733 | if (r) { | ||
| 734 | /* Somethings want wront with the accel init stop accel */ | ||
| 735 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
| 736 | rs690_suspend(rdev); | ||
| 737 | r100_cp_fini(rdev); | ||
| 738 | r100_wb_fini(rdev); | ||
| 739 | r100_ib_fini(rdev); | ||
| 740 | rs400_gart_fini(rdev); | ||
| 741 | radeon_irq_kms_fini(rdev); | ||
| 742 | rdev->accel_working = false; | ||
| 743 | } | ||
| 744 | return 0; | ||
| 650 | } | 745 | } |
diff --git a/drivers/gpu/drm/radeon/rs690d.h b/drivers/gpu/drm/radeon/rs690d.h new file mode 100644 index 000000000000..62d31e7a897f --- /dev/null +++ b/drivers/gpu/drm/radeon/rs690d.h | |||
| @@ -0,0 +1,307 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RS690D_H__ | ||
| 29 | #define __RS690D_H__ | ||
| 30 | |||
| 31 | /* Registers */ | ||
| 32 | #define R_000078_MC_INDEX 0x000078 | ||
| 33 | #define S_000078_MC_IND_ADDR(x) (((x) & 0x1FF) << 0) | ||
| 34 | #define G_000078_MC_IND_ADDR(x) (((x) >> 0) & 0x1FF) | ||
| 35 | #define C_000078_MC_IND_ADDR 0xFFFFFE00 | ||
| 36 | #define S_000078_MC_IND_WR_EN(x) (((x) & 0x1) << 9) | ||
| 37 | #define G_000078_MC_IND_WR_EN(x) (((x) >> 9) & 0x1) | ||
| 38 | #define C_000078_MC_IND_WR_EN 0xFFFFFDFF | ||
| 39 | #define R_00007C_MC_DATA 0x00007C | ||
| 40 | #define S_00007C_MC_DATA(x) (((x) & 0xFFFFFFFF) << 0) | ||
| 41 | #define G_00007C_MC_DATA(x) (((x) >> 0) & 0xFFFFFFFF) | ||
| 42 | #define C_00007C_MC_DATA 0x00000000 | ||
| 43 | #define R_0000F8_CONFIG_MEMSIZE 0x0000F8 | ||
| 44 | #define S_0000F8_CONFIG_MEMSIZE(x) (((x) & 0xFFFFFFFF) << 0) | ||
| 45 | #define G_0000F8_CONFIG_MEMSIZE(x) (((x) >> 0) & 0xFFFFFFFF) | ||
| 46 | #define C_0000F8_CONFIG_MEMSIZE 0x00000000 | ||
| 47 | #define R_000134_HDP_FB_LOCATION 0x000134 | ||
| 48 | #define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 49 | #define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 50 | #define C_000134_HDP_FB_START 0xFFFF0000 | ||
| 51 | #define R_0007C0_CP_STAT 0x0007C0 | ||
| 52 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
| 53 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
| 54 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
| 55 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
| 56 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
| 57 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
| 58 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
| 59 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
| 60 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
| 61 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
| 62 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
| 63 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
| 64 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
| 65 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
| 66 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
| 67 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
| 68 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
| 69 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
| 70 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
| 71 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
| 72 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
| 73 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
| 74 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
| 75 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
| 76 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
| 77 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
| 78 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
| 79 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
| 80 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
| 81 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
| 82 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
| 83 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
| 84 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
| 85 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
| 86 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
| 87 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
| 88 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
| 89 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
| 90 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
| 91 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
| 92 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
| 93 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
| 94 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
| 95 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
| 96 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
| 97 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
| 98 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
| 99 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
| 100 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
| 101 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
| 102 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
| 103 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
| 104 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
| 105 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
| 106 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
| 107 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
| 108 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
| 109 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
| 110 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
| 111 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
| 112 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
| 113 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
| 114 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
| 115 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
| 116 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
| 117 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
| 118 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
| 119 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
| 120 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
| 121 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
| 122 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
| 123 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
| 124 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
| 125 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
| 126 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
| 127 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
| 128 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
| 129 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
| 130 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
| 131 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
| 132 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
| 133 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
| 134 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
| 135 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
| 136 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
| 137 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
| 138 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
| 139 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
| 140 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
| 141 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
| 142 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
| 143 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
| 144 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
| 145 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
| 146 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
| 147 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
| 148 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
| 149 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
| 150 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
| 151 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
| 152 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
| 153 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
| 154 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
| 155 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
| 156 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
| 157 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
| 158 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
| 159 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
| 160 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
| 161 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
| 162 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
| 163 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
| 164 | #define R_006520_DC_LB_MEMORY_SPLIT 0x006520 | ||
| 165 | #define S_006520_DC_LB_MEMORY_SPLIT(x) (((x) & 0x3) << 0) | ||
| 166 | #define G_006520_DC_LB_MEMORY_SPLIT(x) (((x) >> 0) & 0x3) | ||
| 167 | #define C_006520_DC_LB_MEMORY_SPLIT 0xFFFFFFFC | ||
| 168 | #define S_006520_DC_LB_MEMORY_SPLIT_MODE(x) (((x) & 0x1) << 2) | ||
| 169 | #define G_006520_DC_LB_MEMORY_SPLIT_MODE(x) (((x) >> 2) & 0x1) | ||
| 170 | #define C_006520_DC_LB_MEMORY_SPLIT_MODE 0xFFFFFFFB | ||
| 171 | #define V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF 0 | ||
| 172 | #define V_006520_DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q 1 | ||
| 173 | #define V_006520_DC_LB_MEMORY_SPLIT_D1_ONLY 2 | ||
| 174 | #define V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q 3 | ||
| 175 | #define S_006520_DC_LB_DISP1_END_ADR(x) (((x) & 0x7FF) << 4) | ||
| 176 | #define G_006520_DC_LB_DISP1_END_ADR(x) (((x) >> 4) & 0x7FF) | ||
| 177 | #define C_006520_DC_LB_DISP1_END_ADR 0xFFFF800F | ||
| 178 | #define R_006548_D1MODE_PRIORITY_A_CNT 0x006548 | ||
| 179 | #define S_006548_D1MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0) | ||
| 180 | #define G_006548_D1MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF) | ||
| 181 | #define C_006548_D1MODE_PRIORITY_MARK_A 0xFFFF8000 | ||
| 182 | #define S_006548_D1MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16) | ||
| 183 | #define G_006548_D1MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1) | ||
| 184 | #define C_006548_D1MODE_PRIORITY_A_OFF 0xFFFEFFFF | ||
| 185 | #define S_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
| 186 | #define G_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
| 187 | #define C_006548_D1MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF | ||
| 188 | #define R_00654C_D1MODE_PRIORITY_B_CNT 0x00654C | ||
| 189 | #define S_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0) | ||
| 190 | #define G_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF) | ||
| 191 | #define C_00654C_D1MODE_PRIORITY_MARK_B 0xFFFF8000 | ||
| 192 | #define S_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16) | ||
| 193 | #define G_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1) | ||
| 194 | #define C_00654C_D1MODE_PRIORITY_B_OFF 0xFFFEFFFF | ||
| 195 | #define S_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20) | ||
| 196 | #define G_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1) | ||
| 197 | #define C_00654C_D1MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF | ||
| 198 | #define S_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
| 199 | #define G_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
| 200 | #define C_00654C_D1MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF | ||
| 201 | #define R_006C9C_DCP_CONTROL 0x006C9C | ||
| 202 | #define R_006D48_D2MODE_PRIORITY_A_CNT 0x006D48 | ||
| 203 | #define S_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0) | ||
| 204 | #define G_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF) | ||
| 205 | #define C_006D48_D2MODE_PRIORITY_MARK_A 0xFFFF8000 | ||
| 206 | #define S_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16) | ||
| 207 | #define G_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1) | ||
| 208 | #define C_006D48_D2MODE_PRIORITY_A_OFF 0xFFFEFFFF | ||
| 209 | #define S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) & 0x1) << 20) | ||
| 210 | #define G_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) >> 20) & 0x1) | ||
| 211 | #define C_006D48_D2MODE_PRIORITY_A_ALWAYS_ON 0xFFEFFFFF | ||
| 212 | #define S_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
| 213 | #define G_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
| 214 | #define C_006D48_D2MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF | ||
| 215 | #define R_006D4C_D2MODE_PRIORITY_B_CNT 0x006D4C | ||
| 216 | #define S_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0) | ||
| 217 | #define G_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF) | ||
| 218 | #define C_006D4C_D2MODE_PRIORITY_MARK_B 0xFFFF8000 | ||
| 219 | #define S_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16) | ||
| 220 | #define G_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1) | ||
| 221 | #define C_006D4C_D2MODE_PRIORITY_B_OFF 0xFFFEFFFF | ||
| 222 | #define S_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20) | ||
| 223 | #define G_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1) | ||
| 224 | #define C_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF | ||
| 225 | #define S_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
| 226 | #define G_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
| 227 | #define C_006D4C_D2MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF | ||
| 228 | #define R_006D58_LB_MAX_REQ_OUTSTANDING 0x006D58 | ||
| 229 | #define S_006D58_LB_D1_MAX_REQ_OUTSTANDING(x) (((x) & 0xF) << 0) | ||
| 230 | #define G_006D58_LB_D1_MAX_REQ_OUTSTANDING(x) (((x) >> 0) & 0xF) | ||
| 231 | #define C_006D58_LB_D1_MAX_REQ_OUTSTANDING 0xFFFFFFF0 | ||
| 232 | #define S_006D58_LB_D2_MAX_REQ_OUTSTANDING(x) (((x) & 0xF) << 16) | ||
| 233 | #define G_006D58_LB_D2_MAX_REQ_OUTSTANDING(x) (((x) >> 16) & 0xF) | ||
| 234 | #define C_006D58_LB_D2_MAX_REQ_OUTSTANDING 0xFFF0FFFF | ||
| 235 | |||
| 236 | |||
| 237 | #define R_000090_MC_SYSTEM_STATUS 0x000090 | ||
| 238 | #define S_000090_MC_SYSTEM_IDLE(x) (((x) & 0x1) << 0) | ||
| 239 | #define G_000090_MC_SYSTEM_IDLE(x) (((x) >> 0) & 0x1) | ||
| 240 | #define C_000090_MC_SYSTEM_IDLE 0xFFFFFFFE | ||
| 241 | #define S_000090_MC_SEQUENCER_IDLE(x) (((x) & 0x1) << 1) | ||
| 242 | #define G_000090_MC_SEQUENCER_IDLE(x) (((x) >> 1) & 0x1) | ||
| 243 | #define C_000090_MC_SEQUENCER_IDLE 0xFFFFFFFD | ||
| 244 | #define S_000090_MC_ARBITER_IDLE(x) (((x) & 0x1) << 2) | ||
| 245 | #define G_000090_MC_ARBITER_IDLE(x) (((x) >> 2) & 0x1) | ||
| 246 | #define C_000090_MC_ARBITER_IDLE 0xFFFFFFFB | ||
| 247 | #define S_000090_MC_SELECT_PM(x) (((x) & 0x1) << 3) | ||
| 248 | #define G_000090_MC_SELECT_PM(x) (((x) >> 3) & 0x1) | ||
| 249 | #define C_000090_MC_SELECT_PM 0xFFFFFFF7 | ||
| 250 | #define S_000090_RESERVED4(x) (((x) & 0xF) << 4) | ||
| 251 | #define G_000090_RESERVED4(x) (((x) >> 4) & 0xF) | ||
| 252 | #define C_000090_RESERVED4 0xFFFFFF0F | ||
| 253 | #define S_000090_RESERVED8(x) (((x) & 0xF) << 8) | ||
| 254 | #define G_000090_RESERVED8(x) (((x) >> 8) & 0xF) | ||
| 255 | #define C_000090_RESERVED8 0xFFFFF0FF | ||
| 256 | #define S_000090_RESERVED12(x) (((x) & 0xF) << 12) | ||
| 257 | #define G_000090_RESERVED12(x) (((x) >> 12) & 0xF) | ||
| 258 | #define C_000090_RESERVED12 0xFFFF0FFF | ||
| 259 | #define S_000090_MCA_INIT_EXECUTED(x) (((x) & 0x1) << 16) | ||
| 260 | #define G_000090_MCA_INIT_EXECUTED(x) (((x) >> 16) & 0x1) | ||
| 261 | #define C_000090_MCA_INIT_EXECUTED 0xFFFEFFFF | ||
| 262 | #define S_000090_MCA_IDLE(x) (((x) & 0x1) << 17) | ||
| 263 | #define G_000090_MCA_IDLE(x) (((x) >> 17) & 0x1) | ||
| 264 | #define C_000090_MCA_IDLE 0xFFFDFFFF | ||
| 265 | #define S_000090_MCA_SEQ_IDLE(x) (((x) & 0x1) << 18) | ||
| 266 | #define G_000090_MCA_SEQ_IDLE(x) (((x) >> 18) & 0x1) | ||
| 267 | #define C_000090_MCA_SEQ_IDLE 0xFFFBFFFF | ||
| 268 | #define S_000090_MCA_ARB_IDLE(x) (((x) & 0x1) << 19) | ||
| 269 | #define G_000090_MCA_ARB_IDLE(x) (((x) >> 19) & 0x1) | ||
| 270 | #define C_000090_MCA_ARB_IDLE 0xFFF7FFFF | ||
| 271 | #define S_000090_RESERVED20(x) (((x) & 0xFFF) << 20) | ||
| 272 | #define G_000090_RESERVED20(x) (((x) >> 20) & 0xFFF) | ||
| 273 | #define C_000090_RESERVED20 0x000FFFFF | ||
| 274 | #define R_000100_MCCFG_FB_LOCATION 0x000100 | ||
| 275 | #define S_000100_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
| 276 | #define G_000100_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
| 277 | #define C_000100_MC_FB_START 0xFFFF0000 | ||
| 278 | #define S_000100_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
| 279 | #define G_000100_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
| 280 | #define C_000100_MC_FB_TOP 0x0000FFFF | ||
| 281 | #define R_000104_MC_INIT_MISC_LAT_TIMER 0x000104 | ||
| 282 | #define S_000104_MC_CPR_INIT_LAT(x) (((x) & 0xF) << 0) | ||
| 283 | #define G_000104_MC_CPR_INIT_LAT(x) (((x) >> 0) & 0xF) | ||
| 284 | #define C_000104_MC_CPR_INIT_LAT 0xFFFFFFF0 | ||
| 285 | #define S_000104_MC_VF_INIT_LAT(x) (((x) & 0xF) << 4) | ||
| 286 | #define G_000104_MC_VF_INIT_LAT(x) (((x) >> 4) & 0xF) | ||
| 287 | #define C_000104_MC_VF_INIT_LAT 0xFFFFFF0F | ||
| 288 | #define S_000104_MC_DISP0R_INIT_LAT(x) (((x) & 0xF) << 8) | ||
| 289 | #define G_000104_MC_DISP0R_INIT_LAT(x) (((x) >> 8) & 0xF) | ||
| 290 | #define C_000104_MC_DISP0R_INIT_LAT 0xFFFFF0FF | ||
| 291 | #define S_000104_MC_DISP1R_INIT_LAT(x) (((x) & 0xF) << 12) | ||
| 292 | #define G_000104_MC_DISP1R_INIT_LAT(x) (((x) >> 12) & 0xF) | ||
| 293 | #define C_000104_MC_DISP1R_INIT_LAT 0xFFFF0FFF | ||
| 294 | #define S_000104_MC_FIXED_INIT_LAT(x) (((x) & 0xF) << 16) | ||
| 295 | #define G_000104_MC_FIXED_INIT_LAT(x) (((x) >> 16) & 0xF) | ||
| 296 | #define C_000104_MC_FIXED_INIT_LAT 0xFFF0FFFF | ||
| 297 | #define S_000104_MC_E2R_INIT_LAT(x) (((x) & 0xF) << 20) | ||
| 298 | #define G_000104_MC_E2R_INIT_LAT(x) (((x) >> 20) & 0xF) | ||
| 299 | #define C_000104_MC_E2R_INIT_LAT 0xFF0FFFFF | ||
| 300 | #define S_000104_SAME_PAGE_PRIO(x) (((x) & 0xF) << 24) | ||
| 301 | #define G_000104_SAME_PAGE_PRIO(x) (((x) >> 24) & 0xF) | ||
| 302 | #define C_000104_SAME_PAGE_PRIO 0xF0FFFFFF | ||
| 303 | #define S_000104_MC_GLOBW_INIT_LAT(x) (((x) & 0xF) << 28) | ||
| 304 | #define G_000104_MC_GLOBW_INIT_LAT(x) (((x) >> 28) & 0xF) | ||
| 305 | #define C_000104_MC_GLOBW_INIT_LAT 0x0FFFFFFF | ||
| 306 | |||
| 307 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs690r.h b/drivers/gpu/drm/radeon/rs690r.h deleted file mode 100644 index c0d9faa2175b..000000000000 --- a/drivers/gpu/drm/radeon/rs690r.h +++ /dev/null | |||
| @@ -1,99 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef RS690R_H | ||
| 29 | #define RS690R_H | ||
| 30 | |||
| 31 | /* RS690/RS740 registers */ | ||
| 32 | #define MC_INDEX 0x0078 | ||
| 33 | # define MC_INDEX_MASK 0x1FF | ||
| 34 | # define MC_INDEX_WR_EN (1 << 9) | ||
| 35 | # define MC_INDEX_WR_ACK 0x7F | ||
| 36 | #define MC_DATA 0x007C | ||
| 37 | #define HDP_FB_LOCATION 0x0134 | ||
| 38 | #define DC_LB_MEMORY_SPLIT 0x6520 | ||
| 39 | #define DC_LB_MEMORY_SPLIT_MASK 0x00000003 | ||
| 40 | #define DC_LB_MEMORY_SPLIT_SHIFT 0 | ||
| 41 | #define DC_LB_MEMORY_SPLIT_D1HALF_D2HALF 0 | ||
| 42 | #define DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q 1 | ||
| 43 | #define DC_LB_MEMORY_SPLIT_D1_ONLY 2 | ||
| 44 | #define DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q 3 | ||
| 45 | #define DC_LB_MEMORY_SPLIT_SHIFT_MODE (1 << 2) | ||
| 46 | #define DC_LB_DISP1_END_ADR_SHIFT 4 | ||
| 47 | #define DC_LB_DISP1_END_ADR_MASK 0x00007FF0 | ||
| 48 | #define D1MODE_PRIORITY_A_CNT 0x6548 | ||
| 49 | #define MODE_PRIORITY_MARK_MASK 0x00007FFF | ||
| 50 | #define MODE_PRIORITY_OFF (1 << 16) | ||
| 51 | #define MODE_PRIORITY_ALWAYS_ON (1 << 20) | ||
| 52 | #define MODE_PRIORITY_FORCE_MASK (1 << 24) | ||
| 53 | #define D1MODE_PRIORITY_B_CNT 0x654C | ||
| 54 | #define LB_MAX_REQ_OUTSTANDING 0x6D58 | ||
| 55 | #define LB_D1_MAX_REQ_OUTSTANDING_MASK 0x0000000F | ||
| 56 | #define LB_D1_MAX_REQ_OUTSTANDING_SHIFT 0 | ||
| 57 | #define LB_D2_MAX_REQ_OUTSTANDING_MASK 0x000F0000 | ||
| 58 | #define LB_D2_MAX_REQ_OUTSTANDING_SHIFT 16 | ||
| 59 | #define DCP_CONTROL 0x6C9C | ||
| 60 | #define D2MODE_PRIORITY_A_CNT 0x6D48 | ||
| 61 | #define D2MODE_PRIORITY_B_CNT 0x6D4C | ||
| 62 | |||
| 63 | /* MC indirect registers */ | ||
| 64 | #define MC_STATUS_IDLE (1 << 0) | ||
| 65 | #define MC_MISC_CNTL 0x18 | ||
| 66 | #define DISABLE_GTW (1 << 1) | ||
| 67 | #define GART_INDEX_REG_EN (1 << 12) | ||
| 68 | #define BLOCK_GFX_D3_EN (1 << 14) | ||
| 69 | #define GART_FEATURE_ID 0x2B | ||
| 70 | #define HANG_EN (1 << 11) | ||
| 71 | #define TLB_ENABLE (1 << 18) | ||
| 72 | #define P2P_ENABLE (1 << 19) | ||
| 73 | #define GTW_LAC_EN (1 << 25) | ||
| 74 | #define LEVEL2_GART (0 << 30) | ||
| 75 | #define LEVEL1_GART (1 << 30) | ||
| 76 | #define PDC_EN (1 << 31) | ||
| 77 | #define GART_BASE 0x2C | ||
| 78 | #define GART_CACHE_CNTRL 0x2E | ||
| 79 | # define GART_CACHE_INVALIDATE (1 << 0) | ||
| 80 | #define MC_STATUS 0x90 | ||
| 81 | #define MCCFG_FB_LOCATION 0x100 | ||
| 82 | #define MC_FB_START_MASK 0x0000FFFF | ||
| 83 | #define MC_FB_START_SHIFT 0 | ||
| 84 | #define MC_FB_TOP_MASK 0xFFFF0000 | ||
| 85 | #define MC_FB_TOP_SHIFT 16 | ||
| 86 | #define MCCFG_AGP_LOCATION 0x101 | ||
| 87 | #define MC_AGP_START_MASK 0x0000FFFF | ||
| 88 | #define MC_AGP_START_SHIFT 0 | ||
| 89 | #define MC_AGP_TOP_MASK 0xFFFF0000 | ||
| 90 | #define MC_AGP_TOP_SHIFT 16 | ||
| 91 | #define MCCFG_AGP_BASE 0x102 | ||
| 92 | #define MCCFG_AGP_BASE_2 0x103 | ||
| 93 | #define MC_INIT_MISC_LAT_TIMER 0x104 | ||
| 94 | #define MC_DISP0R_INIT_LAT_SHIFT 8 | ||
| 95 | #define MC_DISP0R_INIT_LAT_MASK 0x00000F00 | ||
| 96 | #define MC_DISP1R_INIT_LAT_SHIFT 12 | ||
| 97 | #define MC_DISP1R_INIT_LAT_MASK 0x0000F000 | ||
| 98 | |||
| 99 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv200d.h b/drivers/gpu/drm/radeon/rv200d.h new file mode 100644 index 000000000000..c5b398330c26 --- /dev/null +++ b/drivers/gpu/drm/radeon/rv200d.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RV200D_H__ | ||
| 29 | #define __RV200D_H__ | ||
| 30 | |||
| 31 | #define R_00015C_AGP_BASE_2 0x00015C | ||
| 32 | #define S_00015C_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0) | ||
| 33 | #define G_00015C_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF) | ||
| 34 | #define C_00015C_AGP_BASE_ADDR_2 0xFFFFFFF0 | ||
| 35 | |||
| 36 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv250d.h b/drivers/gpu/drm/radeon/rv250d.h new file mode 100644 index 000000000000..e5a70b06fe1f --- /dev/null +++ b/drivers/gpu/drm/radeon/rv250d.h | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RV250D_H__ | ||
| 29 | #define __RV250D_H__ | ||
| 30 | |||
| 31 | #define R_00000D_SCLK_CNTL_M6 0x00000D | ||
| 32 | #define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0) | ||
| 33 | #define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7) | ||
| 34 | #define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8 | ||
| 35 | #define S_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 3) | ||
| 36 | #define G_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) >> 3) & 0x1) | ||
| 37 | #define C_00000D_CP_MAX_DYN_STOP_LAT 0xFFFFFFF7 | ||
| 38 | #define S_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 4) | ||
| 39 | #define G_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) >> 4) & 0x1) | ||
| 40 | #define C_00000D_HDP_MAX_DYN_STOP_LAT 0xFFFFFFEF | ||
| 41 | #define S_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 5) | ||
| 42 | #define G_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) >> 5) & 0x1) | ||
| 43 | #define C_00000D_TV_MAX_DYN_STOP_LAT 0xFFFFFFDF | ||
| 44 | #define S_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 6) | ||
| 45 | #define G_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) >> 6) & 0x1) | ||
| 46 | #define C_00000D_E2_MAX_DYN_STOP_LAT 0xFFFFFFBF | ||
| 47 | #define S_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 7) | ||
| 48 | #define G_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) >> 7) & 0x1) | ||
| 49 | #define C_00000D_SE_MAX_DYN_STOP_LAT 0xFFFFFF7F | ||
| 50 | #define S_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 8) | ||
| 51 | #define G_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 8) & 0x1) | ||
| 52 | #define C_00000D_IDCT_MAX_DYN_STOP_LAT 0xFFFFFEFF | ||
| 53 | #define S_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 9) | ||
| 54 | #define G_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) >> 9) & 0x1) | ||
| 55 | #define C_00000D_VIP_MAX_DYN_STOP_LAT 0xFFFFFDFF | ||
| 56 | #define S_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 10) | ||
| 57 | #define G_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) >> 10) & 0x1) | ||
| 58 | #define C_00000D_RE_MAX_DYN_STOP_LAT 0xFFFFFBFF | ||
| 59 | #define S_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 11) | ||
| 60 | #define G_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) >> 11) & 0x1) | ||
| 61 | #define C_00000D_PB_MAX_DYN_STOP_LAT 0xFFFFF7FF | ||
| 62 | #define S_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 12) | ||
| 63 | #define G_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) >> 12) & 0x1) | ||
| 64 | #define C_00000D_TAM_MAX_DYN_STOP_LAT 0xFFFFEFFF | ||
| 65 | #define S_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 13) | ||
| 66 | #define G_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) >> 13) & 0x1) | ||
| 67 | #define C_00000D_TDM_MAX_DYN_STOP_LAT 0xFFFFDFFF | ||
| 68 | #define S_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 14) | ||
| 69 | #define G_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) >> 14) & 0x1) | ||
| 70 | #define C_00000D_RB_MAX_DYN_STOP_LAT 0xFFFFBFFF | ||
| 71 | #define S_00000D_FORCE_DISP2(x) (((x) & 0x1) << 15) | ||
| 72 | #define G_00000D_FORCE_DISP2(x) (((x) >> 15) & 0x1) | ||
| 73 | #define C_00000D_FORCE_DISP2 0xFFFF7FFF | ||
| 74 | #define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16) | ||
| 75 | #define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1) | ||
| 76 | #define C_00000D_FORCE_CP 0xFFFEFFFF | ||
| 77 | #define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17) | ||
| 78 | #define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1) | ||
| 79 | #define C_00000D_FORCE_HDP 0xFFFDFFFF | ||
| 80 | #define S_00000D_FORCE_DISP1(x) (((x) & 0x1) << 18) | ||
| 81 | #define G_00000D_FORCE_DISP1(x) (((x) >> 18) & 0x1) | ||
| 82 | #define C_00000D_FORCE_DISP1 0xFFFBFFFF | ||
| 83 | #define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19) | ||
| 84 | #define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1) | ||
| 85 | #define C_00000D_FORCE_TOP 0xFFF7FFFF | ||
| 86 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | ||
| 87 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | ||
| 88 | #define C_00000D_FORCE_E2 0xFFEFFFFF | ||
| 89 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | ||
| 90 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | ||
| 91 | #define C_00000D_FORCE_SE 0xFFDFFFFF | ||
| 92 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | ||
| 93 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | ||
| 94 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | ||
| 95 | #define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23) | ||
| 96 | #define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1) | ||
| 97 | #define C_00000D_FORCE_VIP 0xFF7FFFFF | ||
| 98 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | ||
| 99 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | ||
| 100 | #define C_00000D_FORCE_RE 0xFEFFFFFF | ||
| 101 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | ||
| 102 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | ||
| 103 | #define C_00000D_FORCE_PB 0xFDFFFFFF | ||
| 104 | #define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26) | ||
| 105 | #define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1) | ||
| 106 | #define C_00000D_FORCE_TAM 0xFBFFFFFF | ||
| 107 | #define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27) | ||
| 108 | #define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1) | ||
| 109 | #define C_00000D_FORCE_TDM 0xF7FFFFFF | ||
| 110 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | ||
| 111 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | ||
| 112 | #define C_00000D_FORCE_RB 0xEFFFFFFF | ||
| 113 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) | ||
| 114 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) | ||
| 115 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF | ||
| 116 | #define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30) | ||
| 117 | #define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1) | ||
| 118 | #define C_00000D_FORCE_SUBPIC 0xBFFFFFFF | ||
| 119 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) | ||
| 120 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) | ||
| 121 | #define C_00000D_FORCE_OV0 0x7FFFFFFF | ||
| 122 | |||
| 123 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv350d.h b/drivers/gpu/drm/radeon/rv350d.h new file mode 100644 index 000000000000..c75c5ed9e654 --- /dev/null +++ b/drivers/gpu/drm/radeon/rv350d.h | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
| 3 | * Copyright 2008 Red Hat Inc. | ||
| 4 | * Copyright 2009 Jerome Glisse. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the "Software"), | ||
| 8 | * to deal in the Software without restriction, including without limitation | ||
| 9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 11 | * Software is furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Authors: Dave Airlie | ||
| 25 | * Alex Deucher | ||
| 26 | * Jerome Glisse | ||
| 27 | */ | ||
| 28 | #ifndef __RV350D_H__ | ||
| 29 | #define __RV350D_H__ | ||
| 30 | |||
| 31 | /* RV350, RV380 registers */ | ||
| 32 | /* #define R_00000D_SCLK_CNTL 0x00000D */ | ||
| 33 | #define S_00000D_FORCE_VAP(x) (((x) & 0x1) << 21) | ||
| 34 | #define G_00000D_FORCE_VAP(x) (((x) >> 21) & 0x1) | ||
| 35 | #define C_00000D_FORCE_VAP 0xFFDFFFFF | ||
| 36 | #define S_00000D_FORCE_SR(x) (((x) & 0x1) << 25) | ||
| 37 | #define G_00000D_FORCE_SR(x) (((x) >> 25) & 0x1) | ||
| 38 | #define C_00000D_FORCE_SR 0xFDFFFFFF | ||
| 39 | #define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26) | ||
| 40 | #define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1) | ||
| 41 | #define C_00000D_FORCE_PX 0xFBFFFFFF | ||
| 42 | #define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27) | ||
| 43 | #define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1) | ||
| 44 | #define C_00000D_FORCE_TX 0xF7FFFFFF | ||
| 45 | #define S_00000D_FORCE_US(x) (((x) & 0x1) << 28) | ||
| 46 | #define G_00000D_FORCE_US(x) (((x) >> 28) & 0x1) | ||
| 47 | #define C_00000D_FORCE_US 0xEFFFFFFF | ||
| 48 | #define S_00000D_FORCE_SU(x) (((x) & 0x1) << 30) | ||
| 49 | #define G_00000D_FORCE_SU(x) (((x) >> 30) & 0x1) | ||
| 50 | #define C_00000D_FORCE_SU 0xBFFFFFFF | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index e53b5ca7a253..41a34c23e6d8 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -478,7 +478,7 @@ static int rv515_startup(struct radeon_device *rdev) | |||
| 478 | } | 478 | } |
| 479 | /* Enable IRQ */ | 479 | /* Enable IRQ */ |
| 480 | rdev->irq.sw_int = true; | 480 | rdev->irq.sw_int = true; |
| 481 | r100_irq_set(rdev); | 481 | rs600_irq_set(rdev); |
| 482 | /* 1M ring buffer */ | 482 | /* 1M ring buffer */ |
| 483 | r = r100_cp_init(rdev, 1024 * 1024); | 483 | r = r100_cp_init(rdev, 1024 * 1024); |
| 484 | if (r) { | 484 | if (r) { |
| @@ -520,7 +520,7 @@ int rv515_suspend(struct radeon_device *rdev) | |||
| 520 | { | 520 | { |
| 521 | r100_cp_disable(rdev); | 521 | r100_cp_disable(rdev); |
| 522 | r100_wb_disable(rdev); | 522 | r100_wb_disable(rdev); |
| 523 | r100_irq_disable(rdev); | 523 | rs600_irq_disable(rdev); |
| 524 | if (rdev->flags & RADEON_IS_PCIE) | 524 | if (rdev->flags & RADEON_IS_PCIE) |
| 525 | rv370_pcie_gart_disable(rdev); | 525 | rv370_pcie_gart_disable(rdev); |
| 526 | return 0; | 526 | return 0; |
| @@ -553,7 +553,6 @@ int rv515_init(struct radeon_device *rdev) | |||
| 553 | { | 553 | { |
| 554 | int r; | 554 | int r; |
| 555 | 555 | ||
| 556 | rdev->new_init_path = true; | ||
| 557 | /* Initialize scratch registers */ | 556 | /* Initialize scratch registers */ |
| 558 | radeon_scratch_init(rdev); | 557 | radeon_scratch_init(rdev); |
| 559 | /* Initialize surface registers */ | 558 | /* Initialize surface registers */ |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index e0b97d161397..595ac638039d 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -75,7 +75,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) | |||
| 75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
| 76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | 76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); |
| 77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
| 78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
| 79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
| 80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
| 81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
| @@ -126,17 +126,36 @@ void rv770_pcie_gart_fini(struct radeon_device *rdev) | |||
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | 128 | ||
| 129 | /* | 129 | void rv770_agp_enable(struct radeon_device *rdev) |
| 130 | * MC | ||
| 131 | */ | ||
| 132 | static void rv770_mc_resume(struct radeon_device *rdev) | ||
| 133 | { | 130 | { |
| 134 | u32 d1vga_control, d2vga_control; | 131 | u32 tmp; |
| 135 | u32 vga_render_control, vga_hdp_control; | 132 | int i; |
| 136 | u32 d1crtc_control, d2crtc_control; | 133 | |
| 137 | u32 new_d1grph_primary, new_d1grph_secondary; | 134 | /* Setup L2 cache */ |
| 138 | u32 new_d2grph_primary, new_d2grph_secondary; | 135 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | |
| 139 | u64 old_vram_start; | 136 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | |
| 137 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
| 138 | WREG32(VM_L2_CNTL2, 0); | ||
| 139 | WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); | ||
| 140 | /* Setup TLB control */ | ||
| 141 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
| 142 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
| 143 | SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | | ||
| 144 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); | ||
| 145 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | ||
| 146 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | ||
| 147 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | ||
| 148 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | ||
| 149 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | ||
| 150 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | ||
| 151 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | ||
| 152 | for (i = 0; i < 7; i++) | ||
| 153 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
| 154 | } | ||
| 155 | |||
| 156 | static void rv770_mc_program(struct radeon_device *rdev) | ||
| 157 | { | ||
| 158 | struct rv515_mc_save save; | ||
| 140 | u32 tmp; | 159 | u32 tmp; |
| 141 | int i, j; | 160 | int i, j; |
| 142 | 161 | ||
| @@ -150,53 +169,42 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
| 150 | } | 169 | } |
| 151 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); | 170 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); |
| 152 | 171 | ||
| 153 | d1vga_control = RREG32(D1VGA_CONTROL); | 172 | rv515_mc_stop(rdev, &save); |
| 154 | d2vga_control = RREG32(D2VGA_CONTROL); | ||
| 155 | vga_render_control = RREG32(VGA_RENDER_CONTROL); | ||
| 156 | vga_hdp_control = RREG32(VGA_HDP_CONTROL); | ||
| 157 | d1crtc_control = RREG32(D1CRTC_CONTROL); | ||
| 158 | d2crtc_control = RREG32(D2CRTC_CONTROL); | ||
| 159 | old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; | ||
| 160 | new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS); | ||
| 161 | new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS); | ||
| 162 | new_d1grph_primary += rdev->mc.vram_start - old_vram_start; | ||
| 163 | new_d1grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
| 164 | new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS); | ||
| 165 | new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS); | ||
| 166 | new_d2grph_primary += rdev->mc.vram_start - old_vram_start; | ||
| 167 | new_d2grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
| 168 | |||
| 169 | /* Stop all video */ | ||
| 170 | WREG32(D1VGA_CONTROL, 0); | ||
| 171 | WREG32(D2VGA_CONTROL, 0); | ||
| 172 | WREG32(VGA_RENDER_CONTROL, 0); | ||
| 173 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
| 174 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
| 175 | WREG32(D1CRTC_CONTROL, 0); | ||
| 176 | WREG32(D2CRTC_CONTROL, 0); | ||
| 177 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
| 178 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
| 179 | |||
| 180 | mdelay(1); | ||
| 181 | if (r600_mc_wait_for_idle(rdev)) { | 173 | if (r600_mc_wait_for_idle(rdev)) { |
| 182 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 174 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
| 183 | } | 175 | } |
| 184 | |||
| 185 | /* Lockout access through VGA aperture*/ | 176 | /* Lockout access through VGA aperture*/ |
| 186 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 177 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
| 187 | |||
| 188 | /* Update configuration */ | 178 | /* Update configuration */ |
| 189 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 179 | if (rdev->flags & RADEON_IS_AGP) { |
| 190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 180 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
| 181 | /* VRAM before AGP */ | ||
| 182 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
| 183 | rdev->mc.vram_start >> 12); | ||
| 184 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
| 185 | rdev->mc.gtt_end >> 12); | ||
| 186 | } else { | ||
| 187 | /* VRAM after AGP */ | ||
| 188 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
| 189 | rdev->mc.gtt_start >> 12); | ||
| 190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
| 191 | rdev->mc.vram_end >> 12); | ||
| 192 | } | ||
| 193 | } else { | ||
| 194 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
| 195 | rdev->mc.vram_start >> 12); | ||
| 196 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
| 197 | rdev->mc.vram_end >> 12); | ||
| 198 | } | ||
| 191 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 199 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
| 192 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 200 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
| 193 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 201 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
| 194 | WREG32(MC_VM_FB_LOCATION, tmp); | 202 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 195 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 203 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 196 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 204 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 197 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 205 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); |
| 198 | if (rdev->flags & RADEON_IS_AGP) { | 206 | if (rdev->flags & RADEON_IS_AGP) { |
| 199 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 207 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
| 200 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 208 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
| 201 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 209 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
| 202 | } else { | 210 | } else { |
| @@ -204,31 +212,10 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
| 204 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); | 212 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); |
| 205 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); | 213 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); |
| 206 | } | 214 | } |
| 207 | WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary); | ||
| 208 | WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary); | ||
| 209 | WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary); | ||
| 210 | WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary); | ||
| 211 | WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); | ||
| 212 | |||
| 213 | /* Unlock host access */ | ||
| 214 | WREG32(VGA_HDP_CONTROL, vga_hdp_control); | ||
| 215 | |||
| 216 | mdelay(1); | ||
| 217 | if (r600_mc_wait_for_idle(rdev)) { | 215 | if (r600_mc_wait_for_idle(rdev)) { |
| 218 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 216 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
| 219 | } | 217 | } |
| 220 | 218 | rv515_mc_resume(rdev, &save); | |
| 221 | /* Restore video state */ | ||
| 222 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
| 223 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
| 224 | WREG32(D1CRTC_CONTROL, d1crtc_control); | ||
| 225 | WREG32(D2CRTC_CONTROL, d2crtc_control); | ||
| 226 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
| 227 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
| 228 | WREG32(D1VGA_CONTROL, d1vga_control); | ||
| 229 | WREG32(D2VGA_CONTROL, d2vga_control); | ||
| 230 | WREG32(VGA_RENDER_CONTROL, vga_render_control); | ||
| 231 | |||
| 232 | /* we need to own VRAM, so turn off the VGA renderer here | 219 | /* we need to own VRAM, so turn off the VGA renderer here |
| 233 | * to stop it overwriting our objects */ | 220 | * to stop it overwriting our objects */ |
| 234 | rv515_vga_render_disable(rdev); | 221 | rv515_vga_render_disable(rdev); |
| @@ -840,9 +827,9 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
| 840 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 827 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; |
| 841 | } | 828 | } |
| 842 | rdev->mc.vram_start = rdev->mc.vram_location; | 829 | rdev->mc.vram_start = rdev->mc.vram_location; |
| 843 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 830 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
| 844 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 831 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
| 845 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 832 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
| 846 | /* FIXME: we should enforce default clock in case GPU is not in | 833 | /* FIXME: we should enforce default clock in case GPU is not in |
| 847 | * default setup | 834 | * default setup |
| 848 | */ | 835 | */ |
| @@ -861,11 +848,14 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 861 | { | 848 | { |
| 862 | int r; | 849 | int r; |
| 863 | 850 | ||
| 864 | radeon_gpu_reset(rdev); | 851 | rv770_mc_program(rdev); |
| 865 | rv770_mc_resume(rdev); | 852 | if (rdev->flags & RADEON_IS_AGP) { |
| 866 | r = rv770_pcie_gart_enable(rdev); | 853 | rv770_agp_enable(rdev); |
| 867 | if (r) | 854 | } else { |
| 868 | return r; | 855 | r = rv770_pcie_gart_enable(rdev); |
| 856 | if (r) | ||
| 857 | return r; | ||
| 858 | } | ||
| 869 | rv770_gpu_init(rdev); | 859 | rv770_gpu_init(rdev); |
| 870 | 860 | ||
| 871 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 861 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
| @@ -884,9 +874,8 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 884 | r = r600_cp_resume(rdev); | 874 | r = r600_cp_resume(rdev); |
| 885 | if (r) | 875 | if (r) |
| 886 | return r; | 876 | return r; |
| 887 | r = r600_wb_init(rdev); | 877 | /* write back buffer are not vital so don't worry about failure */ |
| 888 | if (r) | 878 | r600_wb_enable(rdev); |
| 889 | return r; | ||
| 890 | return 0; | 879 | return 0; |
| 891 | } | 880 | } |
| 892 | 881 | ||
| @@ -894,15 +883,12 @@ int rv770_resume(struct radeon_device *rdev) | |||
| 894 | { | 883 | { |
| 895 | int r; | 884 | int r; |
| 896 | 885 | ||
| 897 | if (radeon_gpu_reset(rdev)) { | 886 | /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, |
| 898 | /* FIXME: what do we want to do here ? */ | 887 | * posting will perform necessary task to bring back GPU into good |
| 899 | } | 888 | * shape. |
| 889 | */ | ||
| 900 | /* post card */ | 890 | /* post card */ |
| 901 | if (rdev->is_atom_bios) { | 891 | atom_asic_init(rdev->mode_info.atom_context); |
| 902 | atom_asic_init(rdev->mode_info.atom_context); | ||
| 903 | } else { | ||
| 904 | radeon_combios_asic_init(rdev->ddev); | ||
| 905 | } | ||
| 906 | /* Initialize clocks */ | 892 | /* Initialize clocks */ |
| 907 | r = radeon_clocks_init(rdev); | 893 | r = radeon_clocks_init(rdev); |
| 908 | if (r) { | 894 | if (r) { |
| @@ -915,7 +901,7 @@ int rv770_resume(struct radeon_device *rdev) | |||
| 915 | return r; | 901 | return r; |
| 916 | } | 902 | } |
| 917 | 903 | ||
| 918 | r = radeon_ib_test(rdev); | 904 | r = r600_ib_test(rdev); |
| 919 | if (r) { | 905 | if (r) { |
| 920 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 906 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
| 921 | return r; | 907 | return r; |
| @@ -929,8 +915,8 @@ int rv770_suspend(struct radeon_device *rdev) | |||
| 929 | /* FIXME: we should wait for ring to be empty */ | 915 | /* FIXME: we should wait for ring to be empty */ |
| 930 | r700_cp_stop(rdev); | 916 | r700_cp_stop(rdev); |
| 931 | rdev->cp.ready = false; | 917 | rdev->cp.ready = false; |
| 918 | r600_wb_disable(rdev); | ||
| 932 | rv770_pcie_gart_disable(rdev); | 919 | rv770_pcie_gart_disable(rdev); |
| 933 | |||
| 934 | /* unpin shaders bo */ | 920 | /* unpin shaders bo */ |
| 935 | radeon_object_unpin(rdev->r600_blit.shader_obj); | 921 | radeon_object_unpin(rdev->r600_blit.shader_obj); |
| 936 | return 0; | 922 | return 0; |
| @@ -946,7 +932,6 @@ int rv770_init(struct radeon_device *rdev) | |||
| 946 | { | 932 | { |
| 947 | int r; | 933 | int r; |
| 948 | 934 | ||
| 949 | rdev->new_init_path = true; | ||
| 950 | r = radeon_dummy_page_init(rdev); | 935 | r = radeon_dummy_page_init(rdev); |
| 951 | if (r) | 936 | if (r) |
| 952 | return r; | 937 | return r; |
| @@ -960,8 +945,10 @@ int rv770_init(struct radeon_device *rdev) | |||
| 960 | return -EINVAL; | 945 | return -EINVAL; |
| 961 | } | 946 | } |
| 962 | /* Must be an ATOMBIOS */ | 947 | /* Must be an ATOMBIOS */ |
| 963 | if (!rdev->is_atom_bios) | 948 | if (!rdev->is_atom_bios) { |
| 949 | dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); | ||
| 964 | return -EINVAL; | 950 | return -EINVAL; |
| 951 | } | ||
| 965 | r = radeon_atombios_init(rdev); | 952 | r = radeon_atombios_init(rdev); |
| 966 | if (r) | 953 | if (r) |
| 967 | return r; | 954 | return r; |
| @@ -983,15 +970,8 @@ int rv770_init(struct radeon_device *rdev) | |||
| 983 | if (r) | 970 | if (r) |
| 984 | return r; | 971 | return r; |
| 985 | r = rv770_mc_init(rdev); | 972 | r = rv770_mc_init(rdev); |
| 986 | if (r) { | 973 | if (r) |
| 987 | if (rdev->flags & RADEON_IS_AGP) { | ||
| 988 | /* Retry with disabling AGP */ | ||
| 989 | rv770_fini(rdev); | ||
| 990 | rdev->flags &= ~RADEON_IS_AGP; | ||
| 991 | return rv770_init(rdev); | ||
| 992 | } | ||
| 993 | return r; | 974 | return r; |
| 994 | } | ||
| 995 | /* Memory manager */ | 975 | /* Memory manager */ |
| 996 | r = radeon_object_init(rdev); | 976 | r = radeon_object_init(rdev); |
| 997 | if (r) | 977 | if (r) |
| @@ -1020,12 +1000,10 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1020 | 1000 | ||
| 1021 | r = rv770_startup(rdev); | 1001 | r = rv770_startup(rdev); |
| 1022 | if (r) { | 1002 | if (r) { |
| 1023 | if (rdev->flags & RADEON_IS_AGP) { | 1003 | rv770_suspend(rdev); |
| 1024 | /* Retry with disabling AGP */ | 1004 | r600_wb_fini(rdev); |
| 1025 | rv770_fini(rdev); | 1005 | radeon_ring_fini(rdev); |
| 1026 | rdev->flags &= ~RADEON_IS_AGP; | 1006 | rv770_pcie_gart_fini(rdev); |
| 1027 | return rv770_init(rdev); | ||
| 1028 | } | ||
| 1029 | rdev->accel_working = false; | 1007 | rdev->accel_working = false; |
| 1030 | } | 1008 | } |
| 1031 | if (rdev->accel_working) { | 1009 | if (rdev->accel_working) { |
| @@ -1034,7 +1012,7 @@ int rv770_init(struct radeon_device *rdev) | |||
| 1034 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); | 1012 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); |
| 1035 | rdev->accel_working = false; | 1013 | rdev->accel_working = false; |
| 1036 | } | 1014 | } |
| 1037 | r = radeon_ib_test(rdev); | 1015 | r = r600_ib_test(rdev); |
| 1038 | if (r) { | 1016 | if (r) { |
| 1039 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1017 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
| 1040 | rdev->accel_working = false; | 1018 | rdev->accel_working = false; |
| @@ -1049,20 +1027,15 @@ void rv770_fini(struct radeon_device *rdev) | |||
| 1049 | 1027 | ||
| 1050 | r600_blit_fini(rdev); | 1028 | r600_blit_fini(rdev); |
| 1051 | radeon_ring_fini(rdev); | 1029 | radeon_ring_fini(rdev); |
| 1030 | r600_wb_fini(rdev); | ||
| 1052 | rv770_pcie_gart_fini(rdev); | 1031 | rv770_pcie_gart_fini(rdev); |
| 1053 | radeon_gem_fini(rdev); | 1032 | radeon_gem_fini(rdev); |
| 1054 | radeon_fence_driver_fini(rdev); | 1033 | radeon_fence_driver_fini(rdev); |
| 1055 | radeon_clocks_fini(rdev); | 1034 | radeon_clocks_fini(rdev); |
| 1056 | #if __OS_HAS_AGP | ||
| 1057 | if (rdev->flags & RADEON_IS_AGP) | 1035 | if (rdev->flags & RADEON_IS_AGP) |
| 1058 | radeon_agp_fini(rdev); | 1036 | radeon_agp_fini(rdev); |
| 1059 | #endif | ||
| 1060 | radeon_object_fini(rdev); | 1037 | radeon_object_fini(rdev); |
| 1061 | if (rdev->is_atom_bios) { | 1038 | radeon_atombios_fini(rdev); |
| 1062 | radeon_atombios_fini(rdev); | ||
| 1063 | } else { | ||
| 1064 | radeon_combios_fini(rdev); | ||
| 1065 | } | ||
| 1066 | kfree(rdev->bios); | 1039 | kfree(rdev->bios); |
| 1067 | rdev->bios = NULL; | 1040 | rdev->bios = NULL; |
| 1068 | radeon_dummy_page_fini(rdev); | 1041 | radeon_dummy_page_fini(rdev); |
diff --git a/drivers/gpu/drm/ttm/ttm_global.c b/drivers/gpu/drm/ttm/ttm_global.c index 541744d00d3e..b17007178a36 100644 --- a/drivers/gpu/drm/ttm/ttm_global.c +++ b/drivers/gpu/drm/ttm/ttm_global.c | |||
| @@ -82,8 +82,8 @@ int ttm_global_item_ref(struct ttm_global_reference *ref) | |||
| 82 | if (unlikely(ret != 0)) | 82 | if (unlikely(ret != 0)) |
| 83 | goto out_err; | 83 | goto out_err; |
| 84 | 84 | ||
| 85 | ++item->refcount; | ||
| 86 | } | 85 | } |
| 86 | ++item->refcount; | ||
| 87 | ref->object = item->object; | 87 | ref->object = item->object; |
| 88 | object = item->object; | 88 | object = item->object; |
| 89 | mutex_unlock(&item->mutex); | 89 | mutex_unlock(&item->mutex); |
diff --git a/drivers/hwmon/lis3lv02d_spi.c b/drivers/hwmon/lis3lv02d_spi.c index ecd739534f6a..82b16808a274 100644 --- a/drivers/hwmon/lis3lv02d_spi.c +++ b/drivers/hwmon/lis3lv02d_spi.c | |||
| @@ -83,7 +83,8 @@ static int __devexit lis302dl_spi_remove(struct spi_device *spi) | |||
| 83 | struct lis3lv02d *lis3 = spi_get_drvdata(spi); | 83 | struct lis3lv02d *lis3 = spi_get_drvdata(spi); |
| 84 | lis3lv02d_joystick_disable(); | 84 | lis3lv02d_joystick_disable(); |
| 85 | lis3lv02d_poweroff(lis3); | 85 | lis3lv02d_poweroff(lis3); |
| 86 | return 0; | 86 | |
| 87 | return lis3lv02d_remove_fs(&lis3_dev); | ||
| 87 | } | 88 | } |
| 88 | 89 | ||
| 89 | #ifdef CONFIG_PM | 90 | #ifdef CONFIG_PM |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 4d76ba473097..63c53d65e875 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -1046,6 +1046,15 @@ static void ide_port_init_devices(ide_hwif_t *hwif) | |||
| 1046 | if (port_ops && port_ops->init_dev) | 1046 | if (port_ops && port_ops->init_dev) |
| 1047 | port_ops->init_dev(drive); | 1047 | port_ops->init_dev(drive); |
| 1048 | } | 1048 | } |
| 1049 | |||
| 1050 | ide_port_for_each_dev(i, drive, hwif) { | ||
| 1051 | /* | ||
| 1052 | * default to PIO Mode 0 before we figure out | ||
| 1053 | * the most suited mode for the attached device | ||
| 1054 | */ | ||
| 1055 | if (port_ops && port_ops->set_pio_mode) | ||
| 1056 | port_ops->set_pio_mode(drive, 0); | ||
| 1057 | } | ||
| 1049 | } | 1058 | } |
| 1050 | 1059 | ||
| 1051 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | 1060 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, |
diff --git a/drivers/ide/sis5513.c b/drivers/ide/sis5513.c index afca22beaadf..3b88eba04c9c 100644 --- a/drivers/ide/sis5513.c +++ b/drivers/ide/sis5513.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org> | 2 | * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org> |
| 3 | * Copyright (C) 2002 Lionel Bouton <Lionel.Bouton@inet6.fr>, Maintainer | 3 | * Copyright (C) 2002 Lionel Bouton <Lionel.Bouton@inet6.fr>, Maintainer |
| 4 | * Copyright (C) 2003 Vojtech Pavlik <vojtech@suse.cz> | 4 | * Copyright (C) 2003 Vojtech Pavlik <vojtech@suse.cz> |
| 5 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz | 5 | * Copyright (C) 2007-2009 Bartlomiej Zolnierkiewicz |
| 6 | * | 6 | * |
| 7 | * May be copied or modified under the terms of the GNU General Public License | 7 | * May be copied or modified under the terms of the GNU General Public License |
| 8 | * | 8 | * |
| @@ -281,11 +281,13 @@ static void config_drive_art_rwp(ide_drive_t *drive) | |||
| 281 | 281 | ||
| 282 | pci_read_config_byte(dev, 0x4b, ®4bh); | 282 | pci_read_config_byte(dev, 0x4b, ®4bh); |
| 283 | 283 | ||
| 284 | rw_prefetch = reg4bh & ~(0x11 << drive->dn); | ||
| 285 | |||
| 284 | if (drive->media == ide_disk) | 286 | if (drive->media == ide_disk) |
| 285 | rw_prefetch = 0x11 << drive->dn; | 287 | rw_prefetch |= 0x11 << drive->dn; |
| 286 | 288 | ||
| 287 | if ((reg4bh & (0x11 << drive->dn)) != rw_prefetch) | 289 | if (reg4bh != rw_prefetch) |
| 288 | pci_write_config_byte(dev, 0x4b, reg4bh|rw_prefetch); | 290 | pci_write_config_byte(dev, 0x4b, rw_prefetch); |
| 289 | } | 291 | } |
| 290 | 292 | ||
| 291 | static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio) | 293 | static void sis_set_pio_mode(ide_drive_t *drive, const u8 pio) |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 2388cf578a62..79e3edcced1a 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
| @@ -143,6 +143,7 @@ static const struct xpad_device { | |||
| 143 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 143 | { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
| 144 | { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 144 | { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, |
| 145 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 145 | { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
| 146 | { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | ||
| 146 | { 0x045e, 0x028e, "Microsoft X-Box 360 pad", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 147 | { 0x045e, 0x028e, "Microsoft X-Box 360 pad", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, |
| 147 | { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, | 148 | { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, |
| 148 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 149 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
| @@ -209,6 +210,7 @@ static struct usb_device_id xpad_table [] = { | |||
| 209 | XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ | 210 | XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ |
| 210 | XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ | 211 | XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ |
| 211 | XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ | 212 | XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ |
| 213 | XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ | ||
| 212 | XPAD_XBOX360_VENDOR(0x1bad), /* Rock Band Drums */ | 214 | XPAD_XBOX360_VENDOR(0x1bad), /* Rock Band Drums */ |
| 213 | { } | 215 | { } |
| 214 | }; | 216 | }; |
diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c index c806fbf1e174..3b9f588fc747 100644 --- a/drivers/input/misc/rotary_encoder.c +++ b/drivers/input/misc/rotary_encoder.c | |||
| @@ -106,8 +106,8 @@ static int __devinit rotary_encoder_probe(struct platform_device *pdev) | |||
| 106 | struct input_dev *input; | 106 | struct input_dev *input; |
| 107 | int err; | 107 | int err; |
| 108 | 108 | ||
| 109 | if (!pdata || !pdata->steps) { | 109 | if (!pdata) { |
| 110 | dev_err(&pdev->dev, "invalid platform data\n"); | 110 | dev_err(&pdev->dev, "missing platform data\n"); |
| 111 | return -ENOENT; | 111 | return -ENOENT; |
| 112 | } | 112 | } |
| 113 | 113 | ||
diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c index c4f42311fdec..b064419b90a2 100644 --- a/drivers/input/misc/sparcspkr.c +++ b/drivers/input/misc/sparcspkr.c | |||
| @@ -230,7 +230,7 @@ out_err: | |||
| 230 | return err; | 230 | return err; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | static int bbc_remove(struct of_device *op) | 233 | static int __devexit bbc_remove(struct of_device *op) |
| 234 | { | 234 | { |
| 235 | struct sparcspkr_state *state = dev_get_drvdata(&op->dev); | 235 | struct sparcspkr_state *state = dev_get_drvdata(&op->dev); |
| 236 | struct input_dev *input_dev = state->input_dev; | 236 | struct input_dev *input_dev = state->input_dev; |
| @@ -308,7 +308,7 @@ out_err: | |||
| 308 | return err; | 308 | return err; |
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | static int grover_remove(struct of_device *op) | 311 | static int __devexit grover_remove(struct of_device *op) |
| 312 | { | 312 | { |
| 313 | struct sparcspkr_state *state = dev_get_drvdata(&op->dev); | 313 | struct sparcspkr_state *state = dev_get_drvdata(&op->dev); |
| 314 | struct grover_beep_info *info = &state->u.grover; | 314 | struct grover_beep_info *info = &state->u.grover; |
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index 11fd038a078f..a932179c4c9e 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
| @@ -936,6 +936,15 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
| 936 | }, | 936 | }, |
| 937 | { | 937 | { |
| 938 | .callback = dmi_matched, | 938 | .callback = dmi_matched, |
| 939 | .ident = "Medion MD 42200", | ||
| 940 | .matches = { | ||
| 941 | DMI_MATCH(DMI_SYS_VENDOR, "Medion"), | ||
| 942 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"), | ||
| 943 | }, | ||
| 944 | .driver_data = keymap_fs_amilo_pro_v2000 | ||
| 945 | }, | ||
| 946 | { | ||
| 947 | .callback = dmi_matched, | ||
| 939 | .ident = "Medion MD 96500", | 948 | .ident = "Medion MD 96500", |
| 940 | .matches = { | 949 | .matches = { |
| 941 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | 950 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), |
diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig index c4b3fbd1a80f..aa533ceffe34 100644 --- a/drivers/input/serio/Kconfig +++ b/drivers/input/serio/Kconfig | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | config SERIO | 4 | config SERIO |
| 5 | tristate "Serial I/O support" if EMBEDDED || !X86 | 5 | tristate "Serial I/O support" if EMBEDDED || !X86 |
| 6 | default y | 6 | default y |
| 7 | ---help--- | 7 | help |
| 8 | Say Yes here if you have any input device that uses serial I/O to | 8 | Say Yes here if you have any input device that uses serial I/O to |
| 9 | communicate with the system. This includes the | 9 | communicate with the system. This includes the |
| 10 | * standard AT keyboard and PS/2 mouse * | 10 | * standard AT keyboard and PS/2 mouse * |
| @@ -22,7 +22,7 @@ config SERIO_I8042 | |||
| 22 | tristate "i8042 PC Keyboard controller" if EMBEDDED || !X86 | 22 | tristate "i8042 PC Keyboard controller" if EMBEDDED || !X86 |
| 23 | default y | 23 | default y |
| 24 | depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && !M68K && !BLACKFIN | 24 | depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && !M68K && !BLACKFIN |
| 25 | ---help--- | 25 | help |
| 26 | i8042 is the chip over which the standard AT keyboard and PS/2 | 26 | i8042 is the chip over which the standard AT keyboard and PS/2 |
| 27 | mouse are connected to the computer. If you use these devices, | 27 | mouse are connected to the computer. If you use these devices, |
| 28 | you'll need to say Y here. | 28 | you'll need to say Y here. |
| @@ -35,7 +35,7 @@ config SERIO_I8042 | |||
| 35 | config SERIO_SERPORT | 35 | config SERIO_SERPORT |
| 36 | tristate "Serial port line discipline" | 36 | tristate "Serial port line discipline" |
| 37 | default y | 37 | default y |
| 38 | ---help--- | 38 | help |
| 39 | Say Y here if you plan to use an input device (mouse, joystick, | 39 | Say Y here if you plan to use an input device (mouse, joystick, |
| 40 | tablet, 6dof) that communicates over the RS232 serial (COM) port. | 40 | tablet, 6dof) that communicates over the RS232 serial (COM) port. |
| 41 | 41 | ||
| @@ -49,7 +49,7 @@ config SERIO_SERPORT | |||
| 49 | config SERIO_CT82C710 | 49 | config SERIO_CT82C710 |
| 50 | tristate "ct82c710 Aux port controller" | 50 | tristate "ct82c710 Aux port controller" |
| 51 | depends on X86 | 51 | depends on X86 |
| 52 | ---help--- | 52 | help |
| 53 | Say Y here if you have a Texas Instruments TravelMate notebook | 53 | Say Y here if you have a Texas Instruments TravelMate notebook |
| 54 | equipped with the ct82c710 chip and want to use a mouse connected | 54 | equipped with the ct82c710 chip and want to use a mouse connected |
| 55 | to the "QuickPort". | 55 | to the "QuickPort". |
| @@ -66,7 +66,7 @@ config SERIO_Q40KBD | |||
| 66 | config SERIO_PARKBD | 66 | config SERIO_PARKBD |
| 67 | tristate "Parallel port keyboard adapter" | 67 | tristate "Parallel port keyboard adapter" |
| 68 | depends on PARPORT | 68 | depends on PARPORT |
| 69 | ---help--- | 69 | help |
| 70 | Say Y here if you built a simple parallel port adapter to attach | 70 | Say Y here if you built a simple parallel port adapter to attach |
| 71 | an additional AT keyboard, XT keyboard or PS/2 mouse. | 71 | an additional AT keyboard, XT keyboard or PS/2 mouse. |
| 72 | 72 | ||
| @@ -124,7 +124,7 @@ config HP_SDC | |||
| 124 | tristate "HP System Device Controller i8042 Support" | 124 | tristate "HP System Device Controller i8042 Support" |
| 125 | depends on (GSC || HP300) && SERIO | 125 | depends on (GSC || HP300) && SERIO |
| 126 | default y | 126 | default y |
| 127 | ---help--- | 127 | help |
| 128 | This option enables support for the "System Device | 128 | This option enables support for the "System Device |
| 129 | Controller", an i8042 carrying microcode to manage a | 129 | Controller", an i8042 carrying microcode to manage a |
| 130 | few miscellaneous devices on some Hewlett Packard systems. | 130 | few miscellaneous devices on some Hewlett Packard systems. |
| @@ -168,6 +168,7 @@ config SERIO_MACEPS2 | |||
| 168 | 168 | ||
| 169 | config SERIO_LIBPS2 | 169 | config SERIO_LIBPS2 |
| 170 | tristate "PS/2 driver library" if EMBEDDED | 170 | tristate "PS/2 driver library" if EMBEDDED |
| 171 | depends on SERIO_I8042 || SERIO_I8042=n | ||
| 171 | help | 172 | help |
| 172 | Say Y here if you are using a driver for device connected | 173 | Say Y here if you are using a driver for device connected |
| 173 | to a PS/2 port, such as PS/2 mouse or standard AT keyboard. | 174 | to a PS/2 port, such as PS/2 mouse or standard AT keyboard. |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index bc56e52b945f..a31578170ccc 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
| @@ -609,6 +609,8 @@ static irqreturn_t __init i8042_aux_test_irq(int irq, void *dev_id) | |||
| 609 | str = i8042_read_status(); | 609 | str = i8042_read_status(); |
| 610 | if (str & I8042_STR_OBF) { | 610 | if (str & I8042_STR_OBF) { |
| 611 | data = i8042_read_data(); | 611 | data = i8042_read_data(); |
| 612 | dbg("%02x <- i8042 (aux_test_irq, %s)", | ||
| 613 | data, str & I8042_STR_AUXDATA ? "aux" : "kbd"); | ||
| 612 | if (i8042_irq_being_tested && | 614 | if (i8042_irq_being_tested && |
| 613 | data == 0xa5 && (str & I8042_STR_AUXDATA)) | 615 | data == 0xa5 && (str & I8042_STR_AUXDATA)) |
| 614 | complete(&i8042_aux_irq_delivered); | 616 | complete(&i8042_aux_irq_delivered); |
| @@ -750,6 +752,7 @@ static int __init i8042_check_aux(void) | |||
| 750 | * AUX IRQ was never delivered so we need to flush the controller to | 752 | * AUX IRQ was never delivered so we need to flush the controller to |
| 751 | * get rid of the byte we put there; otherwise keyboard may not work. | 753 | * get rid of the byte we put there; otherwise keyboard may not work. |
| 752 | */ | 754 | */ |
| 755 | dbg(" -- i8042 (aux irq test timeout)"); | ||
| 753 | i8042_flush(); | 756 | i8042_flush(); |
| 754 | retval = -1; | 757 | retval = -1; |
| 755 | } | 758 | } |
diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c index f06332c9e21b..c21e6d3a8844 100644 --- a/drivers/input/touchscreen/ad7879.c +++ b/drivers/input/touchscreen/ad7879.c | |||
| @@ -645,7 +645,7 @@ static int __devinit ad7879_probe(struct spi_device *spi) | |||
| 645 | kfree(ts); | 645 | kfree(ts); |
| 646 | } | 646 | } |
| 647 | 647 | ||
| 648 | return 0; | 648 | return error; |
| 649 | } | 649 | } |
| 650 | 650 | ||
| 651 | static int __devexit ad7879_remove(struct spi_device *spi) | 651 | static int __devexit ad7879_remove(struct spi_device *spi) |
| @@ -732,7 +732,7 @@ static int __devinit ad7879_probe(struct i2c_client *client, | |||
| 732 | kfree(ts); | 732 | kfree(ts); |
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | return 0; | 735 | return error; |
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | static int __devexit ad7879_remove(struct i2c_client *client) | 738 | static int __devexit ad7879_remove(struct i2c_client *client) |
diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 2d8352419c0d..65bf91e16a42 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c | |||
| @@ -603,7 +603,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb) | |||
| 603 | 603 | ||
| 604 | if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) { | 604 | if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) { |
| 605 | u16 info = CAPIMSG_U16(skb->data, 12); // Info field | 605 | u16 info = CAPIMSG_U16(skb->data, 12); // Info field |
| 606 | if (info == 0) { | 606 | if ((info & 0xff00) == 0) { |
| 607 | mutex_lock(&cdev->ncci_list_mtx); | 607 | mutex_lock(&cdev->ncci_list_mtx); |
| 608 | capincci_alloc(cdev, CAPIMSG_NCCI(skb->data)); | 608 | capincci_alloc(cdev, CAPIMSG_NCCI(skb->data)); |
| 609 | mutex_unlock(&cdev->ncci_list_mtx); | 609 | mutex_unlock(&cdev->ncci_list_mtx); |
diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c index 650120261abf..3e6d17f42a98 100644 --- a/drivers/isdn/capi/capidrv.c +++ b/drivers/isdn/capi/capidrv.c | |||
| @@ -40,7 +40,7 @@ static int debugmode = 0; | |||
| 40 | MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux"); | 40 | MODULE_DESCRIPTION("CAPI4Linux: Interface to ISDN4Linux"); |
| 41 | MODULE_AUTHOR("Carsten Paeth"); | 41 | MODULE_AUTHOR("Carsten Paeth"); |
| 42 | MODULE_LICENSE("GPL"); | 42 | MODULE_LICENSE("GPL"); |
| 43 | module_param(debugmode, uint, 0); | 43 | module_param(debugmode, uint, S_IRUGO|S_IWUSR); |
| 44 | 44 | ||
| 45 | /* -------- type definitions ----------------------------------------- */ | 45 | /* -------- type definitions ----------------------------------------- */ |
| 46 | 46 | ||
| @@ -671,8 +671,8 @@ static void n0(capidrv_contr * card, capidrv_ncci * ncci) | |||
| 671 | NULL, /* Useruserdata */ /* $$$$ */ | 671 | NULL, /* Useruserdata */ /* $$$$ */ |
| 672 | NULL /* Facilitydataarray */ | 672 | NULL /* Facilitydataarray */ |
| 673 | ); | 673 | ); |
| 674 | send_message(card, &cmsg); | ||
| 675 | plci_change_state(card, ncci->plcip, EV_PLCI_DISCONNECT_REQ); | 674 | plci_change_state(card, ncci->plcip, EV_PLCI_DISCONNECT_REQ); |
| 675 | send_message(card, &cmsg); | ||
| 676 | 676 | ||
| 677 | cmd.command = ISDN_STAT_BHUP; | 677 | cmd.command = ISDN_STAT_BHUP; |
| 678 | cmd.driver = card->myid; | 678 | cmd.driver = card->myid; |
| @@ -924,8 +924,8 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg) | |||
| 924 | */ | 924 | */ |
| 925 | capi_cmsg_answer(cmsg); | 925 | capi_cmsg_answer(cmsg); |
| 926 | cmsg->Reject = 1; /* ignore */ | 926 | cmsg->Reject = 1; /* ignore */ |
| 927 | send_message(card, cmsg); | ||
| 928 | plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT); | 927 | plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT); |
| 928 | send_message(card, cmsg); | ||
| 929 | printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s ignored\n", | 929 | printk(KERN_INFO "capidrv-%d: incoming call %s,%d,%d,%s ignored\n", |
| 930 | card->contrnr, | 930 | card->contrnr, |
| 931 | cmd.parm.setup.phone, | 931 | cmd.parm.setup.phone, |
| @@ -974,8 +974,8 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg) | |||
| 974 | case 2: /* Call will be rejected. */ | 974 | case 2: /* Call will be rejected. */ |
| 975 | capi_cmsg_answer(cmsg); | 975 | capi_cmsg_answer(cmsg); |
| 976 | cmsg->Reject = 2; /* reject call, normal call clearing */ | 976 | cmsg->Reject = 2; /* reject call, normal call clearing */ |
| 977 | send_message(card, cmsg); | ||
| 978 | plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT); | 977 | plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT); |
| 978 | send_message(card, cmsg); | ||
| 979 | break; | 979 | break; |
| 980 | 980 | ||
| 981 | default: | 981 | default: |
| @@ -983,8 +983,8 @@ static void handle_incoming_call(capidrv_contr * card, _cmsg * cmsg) | |||
| 983 | capi_cmsg_answer(cmsg); | 983 | capi_cmsg_answer(cmsg); |
| 984 | cmsg->Reject = 8; /* reject call, | 984 | cmsg->Reject = 8; /* reject call, |
| 985 | destination out of order */ | 985 | destination out of order */ |
| 986 | send_message(card, cmsg); | ||
| 987 | plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT); | 986 | plci_change_state(card, plcip, EV_PLCI_CONNECT_REJECT); |
| 987 | send_message(card, cmsg); | ||
| 988 | break; | 988 | break; |
| 989 | } | 989 | } |
| 990 | return; | 990 | return; |
| @@ -1020,8 +1020,8 @@ static void handle_plci(_cmsg * cmsg) | |||
| 1020 | card->bchans[plcip->chan].disconnecting = 1; | 1020 | card->bchans[plcip->chan].disconnecting = 1; |
| 1021 | plci_change_state(card, plcip, EV_PLCI_DISCONNECT_IND); | 1021 | plci_change_state(card, plcip, EV_PLCI_DISCONNECT_IND); |
| 1022 | capi_cmsg_answer(cmsg); | 1022 | capi_cmsg_answer(cmsg); |
| 1023 | send_message(card, cmsg); | ||
| 1024 | plci_change_state(card, plcip, EV_PLCI_DISCONNECT_RESP); | 1023 | plci_change_state(card, plcip, EV_PLCI_DISCONNECT_RESP); |
| 1024 | send_message(card, cmsg); | ||
| 1025 | break; | 1025 | break; |
| 1026 | 1026 | ||
| 1027 | case CAPI_DISCONNECT_CONF: /* plci */ | 1027 | case CAPI_DISCONNECT_CONF: /* plci */ |
| @@ -1078,8 +1078,8 @@ static void handle_plci(_cmsg * cmsg) | |||
| 1078 | 1078 | ||
| 1079 | if (card->bchans[plcip->chan].incoming) { | 1079 | if (card->bchans[plcip->chan].incoming) { |
| 1080 | capi_cmsg_answer(cmsg); | 1080 | capi_cmsg_answer(cmsg); |
| 1081 | send_message(card, cmsg); | ||
| 1082 | plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); | 1081 | plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); |
| 1082 | send_message(card, cmsg); | ||
| 1083 | } else { | 1083 | } else { |
| 1084 | capidrv_ncci *nccip; | 1084 | capidrv_ncci *nccip; |
| 1085 | capi_cmsg_answer(cmsg); | 1085 | capi_cmsg_answer(cmsg); |
| @@ -1098,13 +1098,14 @@ static void handle_plci(_cmsg * cmsg) | |||
| 1098 | NULL /* NCPI */ | 1098 | NULL /* NCPI */ |
| 1099 | ); | 1099 | ); |
| 1100 | nccip->msgid = cmsg->Messagenumber; | 1100 | nccip->msgid = cmsg->Messagenumber; |
| 1101 | plci_change_state(card, plcip, | ||
| 1102 | EV_PLCI_CONNECT_ACTIVE_IND); | ||
| 1103 | ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_REQ); | ||
| 1101 | send_message(card, cmsg); | 1104 | send_message(card, cmsg); |
| 1102 | cmd.command = ISDN_STAT_DCONN; | 1105 | cmd.command = ISDN_STAT_DCONN; |
| 1103 | cmd.driver = card->myid; | 1106 | cmd.driver = card->myid; |
| 1104 | cmd.arg = plcip->chan; | 1107 | cmd.arg = plcip->chan; |
| 1105 | card->interface.statcallb(&cmd); | 1108 | card->interface.statcallb(&cmd); |
| 1106 | plci_change_state(card, plcip, EV_PLCI_CONNECT_ACTIVE_IND); | ||
| 1107 | ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_REQ); | ||
| 1108 | } | 1109 | } |
| 1109 | break; | 1110 | break; |
| 1110 | 1111 | ||
| @@ -1193,8 +1194,8 @@ static void handle_ncci(_cmsg * cmsg) | |||
| 1193 | goto notfound; | 1194 | goto notfound; |
| 1194 | 1195 | ||
| 1195 | capi_cmsg_answer(cmsg); | 1196 | capi_cmsg_answer(cmsg); |
| 1196 | send_message(card, cmsg); | ||
| 1197 | ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_ACTIVE_IND); | 1197 | ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_ACTIVE_IND); |
| 1198 | send_message(card, cmsg); | ||
| 1198 | 1199 | ||
| 1199 | cmd.command = ISDN_STAT_BCONN; | 1200 | cmd.command = ISDN_STAT_BCONN; |
| 1200 | cmd.driver = card->myid; | 1201 | cmd.driver = card->myid; |
| @@ -1222,8 +1223,8 @@ static void handle_ncci(_cmsg * cmsg) | |||
| 1222 | 0, /* Reject */ | 1223 | 0, /* Reject */ |
| 1223 | NULL /* NCPI */ | 1224 | NULL /* NCPI */ |
| 1224 | ); | 1225 | ); |
| 1225 | send_message(card, cmsg); | ||
| 1226 | ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP); | 1226 | ncci_change_state(card, nccip, EV_NCCI_CONNECT_B3_RESP); |
| 1227 | send_message(card, cmsg); | ||
| 1227 | break; | 1228 | break; |
| 1228 | } | 1229 | } |
| 1229 | printk(KERN_ERR "capidrv-%d: no mem for ncci, sorry\n", card->contrnr); | 1230 | printk(KERN_ERR "capidrv-%d: no mem for ncci, sorry\n", card->contrnr); |
| @@ -1299,8 +1300,8 @@ static void handle_ncci(_cmsg * cmsg) | |||
| 1299 | card->bchans[nccip->chan].disconnecting = 1; | 1300 | card->bchans[nccip->chan].disconnecting = 1; |
| 1300 | ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_IND); | 1301 | ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_IND); |
| 1301 | capi_cmsg_answer(cmsg); | 1302 | capi_cmsg_answer(cmsg); |
| 1302 | send_message(card, cmsg); | ||
| 1303 | ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_RESP); | 1303 | ncci_change_state(card, nccip, EV_NCCI_DISCONNECT_B3_RESP); |
| 1304 | send_message(card, cmsg); | ||
| 1304 | break; | 1305 | break; |
| 1305 | 1306 | ||
| 1306 | case CAPI_DISCONNECT_B3_CONF: /* ncci */ | 1307 | case CAPI_DISCONNECT_B3_CONF: /* ncci */ |
| @@ -2014,8 +2015,8 @@ static void send_listen(capidrv_contr *card) | |||
| 2014 | card->cipmask, | 2015 | card->cipmask, |
| 2015 | card->cipmask2, | 2016 | card->cipmask2, |
| 2016 | NULL, NULL); | 2017 | NULL, NULL); |
| 2017 | send_message(card, &cmdcmsg); | ||
| 2018 | listen_change_state(card, EV_LISTEN_REQ); | 2018 | listen_change_state(card, EV_LISTEN_REQ); |
| 2019 | send_message(card, &cmdcmsg); | ||
| 2019 | } | 2020 | } |
| 2020 | 2021 | ||
| 2021 | static void listentimerfunc(unsigned long x) | 2022 | static void listentimerfunc(unsigned long x) |
diff --git a/drivers/isdn/gigaset/asyncdata.c b/drivers/isdn/gigaset/asyncdata.c index 234cc5d53312..44a58e6f8f65 100644 --- a/drivers/isdn/gigaset/asyncdata.c +++ b/drivers/isdn/gigaset/asyncdata.c | |||
| @@ -334,7 +334,14 @@ static inline int iraw_loop(unsigned char c, unsigned char *src, int numbytes, | |||
| 334 | return startbytes - numbytes; | 334 | return startbytes - numbytes; |
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | /* process a block of data received from the device | 337 | /** |
| 338 | * gigaset_m10x_input() - process a block of data received from the device | ||
| 339 | * @inbuf: received data and device descriptor structure. | ||
| 340 | * | ||
| 341 | * Called by hardware module {ser,usb}_gigaset with a block of received | ||
| 342 | * bytes. Separates the bytes received over the serial data channel into | ||
| 343 | * user data and command replies (locked/unlocked) according to the | ||
| 344 | * current state of the interface. | ||
| 338 | */ | 345 | */ |
| 339 | void gigaset_m10x_input(struct inbuf_t *inbuf) | 346 | void gigaset_m10x_input(struct inbuf_t *inbuf) |
| 340 | { | 347 | { |
| @@ -543,16 +550,17 @@ static struct sk_buff *iraw_encode(struct sk_buff *skb, int head, int tail) | |||
| 543 | return iraw_skb; | 550 | return iraw_skb; |
| 544 | } | 551 | } |
| 545 | 552 | ||
| 546 | /* gigaset_send_skb | 553 | /** |
| 547 | * called by common.c to queue an skb for sending | 554 | * gigaset_m10x_send_skb() - queue an skb for sending |
| 548 | * and start transmission if necessary | 555 | * @bcs: B channel descriptor structure. |
| 549 | * parameters: | 556 | * @skb: data to send. |
| 550 | * B Channel control structure | 557 | * |
| 551 | * skb | 558 | * Called by i4l.c to encode and queue an skb for sending, and start |
| 559 | * transmission if necessary. | ||
| 560 | * | ||
| 552 | * Return value: | 561 | * Return value: |
| 553 | * number of bytes accepted for sending | 562 | * number of bytes accepted for sending (skb->len) if ok, |
| 554 | * (skb->len if ok, 0 if out of buffer space) | 563 | * error code < 0 (eg. -ENOMEM) on error |
| 555 | * or error code (< 0, eg. -EINVAL) | ||
| 556 | */ | 564 | */ |
| 557 | int gigaset_m10x_send_skb(struct bc_state *bcs, struct sk_buff *skb) | 565 | int gigaset_m10x_send_skb(struct bc_state *bcs, struct sk_buff *skb) |
| 558 | { | 566 | { |
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 781c4041f7b0..5ed1d99eb9f3 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
| @@ -134,6 +134,7 @@ struct bas_cardstate { | |||
| 134 | #define BS_ATRDPEND 0x040 /* urb_cmd_in in use */ | 134 | #define BS_ATRDPEND 0x040 /* urb_cmd_in in use */ |
| 135 | #define BS_ATWRPEND 0x080 /* urb_cmd_out in use */ | 135 | #define BS_ATWRPEND 0x080 /* urb_cmd_out in use */ |
| 136 | #define BS_SUSPEND 0x100 /* USB port suspended */ | 136 | #define BS_SUSPEND 0x100 /* USB port suspended */ |
| 137 | #define BS_RESETTING 0x200 /* waiting for HD_RESET_INTERRUPT_PIPE_ACK */ | ||
| 137 | 138 | ||
| 138 | 139 | ||
| 139 | static struct gigaset_driver *driver = NULL; | 140 | static struct gigaset_driver *driver = NULL; |
| @@ -319,6 +320,21 @@ static int gigaset_set_line_ctrl(struct cardstate *cs, unsigned cflag) | |||
| 319 | return -EINVAL; | 320 | return -EINVAL; |
| 320 | } | 321 | } |
| 321 | 322 | ||
| 323 | /* set/clear bits in base connection state, return previous state | ||
| 324 | */ | ||
| 325 | static inline int update_basstate(struct bas_cardstate *ucs, | ||
| 326 | int set, int clear) | ||
| 327 | { | ||
| 328 | unsigned long flags; | ||
| 329 | int state; | ||
| 330 | |||
| 331 | spin_lock_irqsave(&ucs->lock, flags); | ||
| 332 | state = ucs->basstate; | ||
| 333 | ucs->basstate = (state & ~clear) | set; | ||
| 334 | spin_unlock_irqrestore(&ucs->lock, flags); | ||
| 335 | return state; | ||
| 336 | } | ||
| 337 | |||
| 322 | /* error_hangup | 338 | /* error_hangup |
| 323 | * hang up any existing connection because of an unrecoverable error | 339 | * hang up any existing connection because of an unrecoverable error |
| 324 | * This function may be called from any context and takes care of scheduling | 340 | * This function may be called from any context and takes care of scheduling |
| @@ -350,12 +366,9 @@ static inline void error_hangup(struct bc_state *bcs) | |||
| 350 | */ | 366 | */ |
| 351 | static inline void error_reset(struct cardstate *cs) | 367 | static inline void error_reset(struct cardstate *cs) |
| 352 | { | 368 | { |
| 353 | /* close AT command channel to recover (ignore errors) */ | 369 | /* reset interrupt pipe to recover (ignore errors) */ |
| 354 | req_submit(cs->bcs, HD_CLOSE_ATCHANNEL, 0, BAS_TIMEOUT); | 370 | update_basstate(cs->hw.bas, BS_RESETTING, 0); |
| 355 | 371 | req_submit(cs->bcs, HD_RESET_INTERRUPT_PIPE, 0, BAS_TIMEOUT); | |
| 356 | //FIXME try to recover without bothering the user | ||
| 357 | dev_err(cs->dev, | ||
| 358 | "unrecoverable error - please disconnect Gigaset base to reset\n"); | ||
| 359 | } | 372 | } |
| 360 | 373 | ||
| 361 | /* check_pending | 374 | /* check_pending |
| @@ -398,8 +411,13 @@ static void check_pending(struct bas_cardstate *ucs) | |||
| 398 | case HD_DEVICE_INIT_ACK: /* no reply expected */ | 411 | case HD_DEVICE_INIT_ACK: /* no reply expected */ |
| 399 | ucs->pending = 0; | 412 | ucs->pending = 0; |
| 400 | break; | 413 | break; |
| 401 | /* HD_READ_ATMESSAGE, HD_WRITE_ATMESSAGE, HD_RESET_INTERRUPTPIPE | 414 | case HD_RESET_INTERRUPT_PIPE: |
| 402 | * are handled separately and should never end up here | 415 | if (!(ucs->basstate & BS_RESETTING)) |
| 416 | ucs->pending = 0; | ||
| 417 | break; | ||
| 418 | /* | ||
| 419 | * HD_READ_ATMESSAGE and HD_WRITE_ATMESSAGE are handled separately | ||
| 420 | * and should never end up here | ||
| 403 | */ | 421 | */ |
| 404 | default: | 422 | default: |
| 405 | dev_warn(&ucs->interface->dev, | 423 | dev_warn(&ucs->interface->dev, |
| @@ -449,21 +467,6 @@ static void cmd_in_timeout(unsigned long data) | |||
| 449 | error_reset(cs); | 467 | error_reset(cs); |
| 450 | } | 468 | } |
| 451 | 469 | ||
| 452 | /* set/clear bits in base connection state, return previous state | ||
| 453 | */ | ||
| 454 | inline static int update_basstate(struct bas_cardstate *ucs, | ||
| 455 | int set, int clear) | ||
| 456 | { | ||
| 457 | unsigned long flags; | ||
| 458 | int state; | ||
| 459 | |||
| 460 | spin_lock_irqsave(&ucs->lock, flags); | ||
| 461 | state = ucs->basstate; | ||
| 462 | ucs->basstate = (state & ~clear) | set; | ||
| 463 | spin_unlock_irqrestore(&ucs->lock, flags); | ||
| 464 | return state; | ||
| 465 | } | ||
| 466 | |||
| 467 | /* read_ctrl_callback | 470 | /* read_ctrl_callback |
| 468 | * USB completion handler for control pipe input | 471 | * USB completion handler for control pipe input |
| 469 | * called by the USB subsystem in interrupt context | 472 | * called by the USB subsystem in interrupt context |
| @@ -762,7 +765,8 @@ static void read_int_callback(struct urb *urb) | |||
| 762 | break; | 765 | break; |
| 763 | 766 | ||
| 764 | case HD_RESET_INTERRUPT_PIPE_ACK: | 767 | case HD_RESET_INTERRUPT_PIPE_ACK: |
| 765 | gig_dbg(DEBUG_USBREQ, "HD_RESET_INTERRUPT_PIPE_ACK"); | 768 | update_basstate(ucs, 0, BS_RESETTING); |
| 769 | dev_notice(cs->dev, "interrupt pipe reset\n"); | ||
| 766 | break; | 770 | break; |
| 767 | 771 | ||
| 768 | case HD_SUSPEND_END: | 772 | case HD_SUSPEND_END: |
| @@ -1331,28 +1335,24 @@ static void read_iso_tasklet(unsigned long data) | |||
| 1331 | rcvbuf = urb->transfer_buffer; | 1335 | rcvbuf = urb->transfer_buffer; |
| 1332 | totleft = urb->actual_length; | 1336 | totleft = urb->actual_length; |
| 1333 | for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) { | 1337 | for (frame = 0; totleft > 0 && frame < BAS_NUMFRAMES; frame++) { |
| 1334 | if (unlikely(urb->iso_frame_desc[frame].status)) { | 1338 | numbytes = urb->iso_frame_desc[frame].actual_length; |
| 1339 | if (unlikely(urb->iso_frame_desc[frame].status)) | ||
| 1335 | dev_warn(cs->dev, | 1340 | dev_warn(cs->dev, |
| 1336 | "isochronous read: frame %d: %s\n", | 1341 | "isochronous read: frame %d[%d]: %s\n", |
| 1337 | frame, | 1342 | frame, numbytes, |
| 1338 | get_usb_statmsg( | 1343 | get_usb_statmsg( |
| 1339 | urb->iso_frame_desc[frame].status)); | 1344 | urb->iso_frame_desc[frame].status)); |
| 1340 | break; | 1345 | if (unlikely(numbytes > BAS_MAXFRAME)) |
| 1341 | } | ||
| 1342 | numbytes = urb->iso_frame_desc[frame].actual_length; | ||
| 1343 | if (unlikely(numbytes > BAS_MAXFRAME)) { | ||
| 1344 | dev_warn(cs->dev, | 1346 | dev_warn(cs->dev, |
| 1345 | "isochronous read: frame %d: " | 1347 | "isochronous read: frame %d: " |
| 1346 | "numbytes (%d) > BAS_MAXFRAME\n", | 1348 | "numbytes (%d) > BAS_MAXFRAME\n", |
| 1347 | frame, numbytes); | 1349 | frame, numbytes); |
| 1348 | break; | ||
| 1349 | } | ||
| 1350 | if (unlikely(numbytes > totleft)) { | 1350 | if (unlikely(numbytes > totleft)) { |
| 1351 | dev_warn(cs->dev, | 1351 | dev_warn(cs->dev, |
| 1352 | "isochronous read: frame %d: " | 1352 | "isochronous read: frame %d: " |
| 1353 | "numbytes (%d) > totleft (%d)\n", | 1353 | "numbytes (%d) > totleft (%d)\n", |
| 1354 | frame, numbytes, totleft); | 1354 | frame, numbytes, totleft); |
| 1355 | break; | 1355 | numbytes = totleft; |
| 1356 | } | 1356 | } |
| 1357 | offset = urb->iso_frame_desc[frame].offset; | 1357 | offset = urb->iso_frame_desc[frame].offset; |
| 1358 | if (unlikely(offset + numbytes > BAS_INBUFSIZE)) { | 1358 | if (unlikely(offset + numbytes > BAS_INBUFSIZE)) { |
| @@ -1361,7 +1361,7 @@ static void read_iso_tasklet(unsigned long data) | |||
| 1361 | "offset (%d) + numbytes (%d) " | 1361 | "offset (%d) + numbytes (%d) " |
| 1362 | "> BAS_INBUFSIZE\n", | 1362 | "> BAS_INBUFSIZE\n", |
| 1363 | frame, offset, numbytes); | 1363 | frame, offset, numbytes); |
| 1364 | break; | 1364 | numbytes = BAS_INBUFSIZE - offset; |
| 1365 | } | 1365 | } |
| 1366 | gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs); | 1366 | gigaset_isoc_receive(rcvbuf + offset, numbytes, bcs); |
| 1367 | totleft -= numbytes; | 1367 | totleft -= numbytes; |
| @@ -1433,6 +1433,7 @@ static void req_timeout(unsigned long data) | |||
| 1433 | 1433 | ||
| 1434 | case HD_CLOSE_ATCHANNEL: | 1434 | case HD_CLOSE_ATCHANNEL: |
| 1435 | dev_err(bcs->cs->dev, "timeout closing AT channel\n"); | 1435 | dev_err(bcs->cs->dev, "timeout closing AT channel\n"); |
| 1436 | error_reset(bcs->cs); | ||
| 1436 | break; | 1437 | break; |
| 1437 | 1438 | ||
| 1438 | case HD_CLOSE_B2CHANNEL: | 1439 | case HD_CLOSE_B2CHANNEL: |
| @@ -1442,6 +1443,13 @@ static void req_timeout(unsigned long data) | |||
| 1442 | error_reset(bcs->cs); | 1443 | error_reset(bcs->cs); |
| 1443 | break; | 1444 | break; |
| 1444 | 1445 | ||
| 1446 | case HD_RESET_INTERRUPT_PIPE: | ||
| 1447 | /* error recovery escalation */ | ||
| 1448 | dev_err(bcs->cs->dev, | ||
| 1449 | "reset interrupt pipe timeout, attempting USB reset\n"); | ||
| 1450 | usb_queue_reset_device(bcs->cs->hw.bas->interface); | ||
| 1451 | break; | ||
| 1452 | |||
| 1445 | default: | 1453 | default: |
| 1446 | dev_warn(bcs->cs->dev, "request 0x%02x timed out, clearing\n", | 1454 | dev_warn(bcs->cs->dev, "request 0x%02x timed out, clearing\n", |
| 1447 | pending); | 1455 | pending); |
| @@ -1934,6 +1942,15 @@ static int gigaset_write_cmd(struct cardstate *cs, | |||
| 1934 | goto notqueued; | 1942 | goto notqueued; |
| 1935 | } | 1943 | } |
| 1936 | 1944 | ||
| 1945 | /* translate "+++" escape sequence sent as a single separate command | ||
| 1946 | * into "close AT channel" command for error recovery | ||
| 1947 | * The next command will reopen the AT channel automatically. | ||
| 1948 | */ | ||
| 1949 | if (len == 3 && !memcmp(buf, "+++", 3)) { | ||
| 1950 | rc = req_submit(cs->bcs, HD_CLOSE_ATCHANNEL, 0, BAS_TIMEOUT); | ||
| 1951 | goto notqueued; | ||
| 1952 | } | ||
| 1953 | |||
| 1937 | if (len > IF_WRITEBUF) | 1954 | if (len > IF_WRITEBUF) |
| 1938 | len = IF_WRITEBUF; | 1955 | len = IF_WRITEBUF; |
| 1939 | if (!(cb = kmalloc(sizeof(struct cmdbuf_t) + len, GFP_ATOMIC))) { | 1956 | if (!(cb = kmalloc(sizeof(struct cmdbuf_t) + len, GFP_ATOMIC))) { |
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index e4141bf8b2f3..33dcd8d72b7c 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
| @@ -22,6 +22,12 @@ | |||
| 22 | #define DRIVER_AUTHOR "Hansjoerg Lipp <hjlipp@web.de>, Tilman Schmidt <tilman@imap.cc>, Stefan Eilers" | 22 | #define DRIVER_AUTHOR "Hansjoerg Lipp <hjlipp@web.de>, Tilman Schmidt <tilman@imap.cc>, Stefan Eilers" |
| 23 | #define DRIVER_DESC "Driver for Gigaset 307x" | 23 | #define DRIVER_DESC "Driver for Gigaset 307x" |
| 24 | 24 | ||
| 25 | #ifdef CONFIG_GIGASET_DEBUG | ||
| 26 | #define DRIVER_DESC_DEBUG " (debug build)" | ||
| 27 | #else | ||
| 28 | #define DRIVER_DESC_DEBUG "" | ||
| 29 | #endif | ||
| 30 | |||
| 25 | /* Module parameters */ | 31 | /* Module parameters */ |
| 26 | int gigaset_debuglevel = DEBUG_DEFAULT; | 32 | int gigaset_debuglevel = DEBUG_DEFAULT; |
| 27 | EXPORT_SYMBOL_GPL(gigaset_debuglevel); | 33 | EXPORT_SYMBOL_GPL(gigaset_debuglevel); |
| @@ -32,6 +38,17 @@ MODULE_PARM_DESC(debug, "debug level"); | |||
| 32 | #define VALID_MINOR 0x01 | 38 | #define VALID_MINOR 0x01 |
| 33 | #define VALID_ID 0x02 | 39 | #define VALID_ID 0x02 |
| 34 | 40 | ||
| 41 | /** | ||
| 42 | * gigaset_dbg_buffer() - dump data in ASCII and hex for debugging | ||
| 43 | * @level: debugging level. | ||
| 44 | * @msg: message prefix. | ||
| 45 | * @len: number of bytes to dump. | ||
| 46 | * @buf: data to dump. | ||
| 47 | * | ||
| 48 | * If the current debugging level includes one of the bits set in @level, | ||
| 49 | * @len bytes starting at @buf are logged to dmesg at KERN_DEBUG prio, | ||
| 50 | * prefixed by the text @msg. | ||
| 51 | */ | ||
| 35 | void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | 52 | void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, |
| 36 | size_t len, const unsigned char *buf) | 53 | size_t len, const unsigned char *buf) |
| 37 | { | 54 | { |
| @@ -274,6 +291,20 @@ static void clear_events(struct cardstate *cs) | |||
| 274 | spin_unlock_irqrestore(&cs->ev_lock, flags); | 291 | spin_unlock_irqrestore(&cs->ev_lock, flags); |
| 275 | } | 292 | } |
| 276 | 293 | ||
| 294 | /** | ||
| 295 | * gigaset_add_event() - add event to device event queue | ||
| 296 | * @cs: device descriptor structure. | ||
| 297 | * @at_state: connection state structure. | ||
| 298 | * @type: event type. | ||
| 299 | * @ptr: pointer parameter for event. | ||
| 300 | * @parameter: integer parameter for event. | ||
| 301 | * @arg: pointer parameter for event. | ||
| 302 | * | ||
| 303 | * Allocate an event queue entry from the device's event queue, and set it up | ||
| 304 | * with the parameters given. | ||
| 305 | * | ||
| 306 | * Return value: added event | ||
| 307 | */ | ||
| 277 | struct event_t *gigaset_add_event(struct cardstate *cs, | 308 | struct event_t *gigaset_add_event(struct cardstate *cs, |
| 278 | struct at_state_t *at_state, int type, | 309 | struct at_state_t *at_state, int type, |
| 279 | void *ptr, int parameter, void *arg) | 310 | void *ptr, int parameter, void *arg) |
| @@ -398,6 +429,15 @@ static void make_invalid(struct cardstate *cs, unsigned mask) | |||
| 398 | spin_unlock_irqrestore(&drv->lock, flags); | 429 | spin_unlock_irqrestore(&drv->lock, flags); |
| 399 | } | 430 | } |
| 400 | 431 | ||
| 432 | /** | ||
| 433 | * gigaset_freecs() - free all associated ressources of a device | ||
| 434 | * @cs: device descriptor structure. | ||
| 435 | * | ||
| 436 | * Stops all tasklets and timers, unregisters the device from all | ||
| 437 | * subsystems it was registered to, deallocates the device structure | ||
| 438 | * @cs and all structures referenced from it. | ||
| 439 | * Operations on the device should be stopped before calling this. | ||
| 440 | */ | ||
| 401 | void gigaset_freecs(struct cardstate *cs) | 441 | void gigaset_freecs(struct cardstate *cs) |
| 402 | { | 442 | { |
| 403 | int i; | 443 | int i; |
| @@ -506,7 +546,12 @@ static void gigaset_inbuf_init(struct inbuf_t *inbuf, struct bc_state *bcs, | |||
| 506 | inbuf->inputstate = inputstate; | 546 | inbuf->inputstate = inputstate; |
| 507 | } | 547 | } |
| 508 | 548 | ||
| 509 | /* append received bytes to inbuf */ | 549 | /** |
| 550 | * gigaset_fill_inbuf() - append received data to input buffer | ||
| 551 | * @inbuf: buffer structure. | ||
| 552 | * @src: received data. | ||
| 553 | * @numbytes: number of bytes received. | ||
| 554 | */ | ||
| 510 | int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src, | 555 | int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src, |
| 511 | unsigned numbytes) | 556 | unsigned numbytes) |
| 512 | { | 557 | { |
| @@ -606,20 +651,22 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
| 606 | return NULL; | 651 | return NULL; |
| 607 | } | 652 | } |
| 608 | 653 | ||
| 609 | /* gigaset_initcs | 654 | /** |
| 655 | * gigaset_initcs() - initialize device structure | ||
| 656 | * @drv: hardware driver the device belongs to | ||
| 657 | * @channels: number of B channels supported by device | ||
| 658 | * @onechannel: !=0 if B channel data and AT commands share one | ||
| 659 | * communication channel (M10x), | ||
| 660 | * ==0 if B channels have separate communication channels (base) | ||
| 661 | * @ignoreframes: number of frames to ignore after setting up B channel | ||
| 662 | * @cidmode: !=0: start in CallID mode | ||
| 663 | * @modulename: name of driver module for LL registration | ||
| 664 | * | ||
| 610 | * Allocate and initialize cardstate structure for Gigaset driver | 665 | * Allocate and initialize cardstate structure for Gigaset driver |
| 611 | * Calls hardware dependent gigaset_initcshw() function | 666 | * Calls hardware dependent gigaset_initcshw() function |
| 612 | * Calls B channel initialization function gigaset_initbcs() for each B channel | 667 | * Calls B channel initialization function gigaset_initbcs() for each B channel |
| 613 | * parameters: | 668 | * |
| 614 | * drv hardware driver the device belongs to | 669 | * Return value: |
| 615 | * channels number of B channels supported by device | ||
| 616 | * onechannel !=0: B channel data and AT commands share one | ||
| 617 | * communication channel | ||
| 618 | * ==0: B channels have separate communication channels | ||
| 619 | * ignoreframes number of frames to ignore after setting up B channel | ||
| 620 | * cidmode !=0: start in CallID mode | ||
| 621 | * modulename name of driver module (used for I4L registration) | ||
| 622 | * return value: | ||
| 623 | * pointer to cardstate structure | 670 | * pointer to cardstate structure |
| 624 | */ | 671 | */ |
| 625 | struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, | 672 | struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, |
| @@ -837,6 +884,17 @@ static void cleanup_cs(struct cardstate *cs) | |||
| 837 | } | 884 | } |
| 838 | 885 | ||
| 839 | 886 | ||
| 887 | /** | ||
| 888 | * gigaset_start() - start device operations | ||
| 889 | * @cs: device descriptor structure. | ||
| 890 | * | ||
| 891 | * Prepares the device for use by setting up communication parameters, | ||
| 892 | * scheduling an EV_START event to initiate device initialization, and | ||
| 893 | * waiting for completion of the initialization. | ||
| 894 | * | ||
| 895 | * Return value: | ||
| 896 | * 1 - success, 0 - error | ||
| 897 | */ | ||
| 840 | int gigaset_start(struct cardstate *cs) | 898 | int gigaset_start(struct cardstate *cs) |
| 841 | { | 899 | { |
| 842 | unsigned long flags; | 900 | unsigned long flags; |
| @@ -879,9 +937,15 @@ error: | |||
| 879 | } | 937 | } |
| 880 | EXPORT_SYMBOL_GPL(gigaset_start); | 938 | EXPORT_SYMBOL_GPL(gigaset_start); |
| 881 | 939 | ||
| 882 | /* gigaset_shutdown | 940 | /** |
| 883 | * check if a device is associated to the cardstate structure and stop it | 941 | * gigaset_shutdown() - shut down device operations |
| 884 | * return value: 0 if ok, -1 if no device was associated | 942 | * @cs: device descriptor structure. |
| 943 | * | ||
| 944 | * Deactivates the device by scheduling an EV_SHUTDOWN event and | ||
| 945 | * waiting for completion of the shutdown. | ||
| 946 | * | ||
| 947 | * Return value: | ||
| 948 | * 0 - success, -1 - error (no device associated) | ||
| 885 | */ | 949 | */ |
| 886 | int gigaset_shutdown(struct cardstate *cs) | 950 | int gigaset_shutdown(struct cardstate *cs) |
| 887 | { | 951 | { |
| @@ -912,6 +976,13 @@ exit: | |||
| 912 | } | 976 | } |
| 913 | EXPORT_SYMBOL_GPL(gigaset_shutdown); | 977 | EXPORT_SYMBOL_GPL(gigaset_shutdown); |
| 914 | 978 | ||
| 979 | /** | ||
| 980 | * gigaset_stop() - stop device operations | ||
| 981 | * @cs: device descriptor structure. | ||
| 982 | * | ||
| 983 | * Stops operations on the device by scheduling an EV_STOP event and | ||
| 984 | * waiting for completion of the shutdown. | ||
| 985 | */ | ||
| 915 | void gigaset_stop(struct cardstate *cs) | 986 | void gigaset_stop(struct cardstate *cs) |
| 916 | { | 987 | { |
| 917 | mutex_lock(&cs->mutex); | 988 | mutex_lock(&cs->mutex); |
| @@ -1020,6 +1091,14 @@ struct cardstate *gigaset_get_cs_by_tty(struct tty_struct *tty) | |||
| 1020 | return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start); | 1091 | return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start); |
| 1021 | } | 1092 | } |
| 1022 | 1093 | ||
| 1094 | /** | ||
| 1095 | * gigaset_freedriver() - free all associated ressources of a driver | ||
| 1096 | * @drv: driver descriptor structure. | ||
| 1097 | * | ||
| 1098 | * Unregisters the driver from the system and deallocates the driver | ||
| 1099 | * structure @drv and all structures referenced from it. | ||
| 1100 | * All devices should be shut down before calling this. | ||
| 1101 | */ | ||
| 1023 | void gigaset_freedriver(struct gigaset_driver *drv) | 1102 | void gigaset_freedriver(struct gigaset_driver *drv) |
| 1024 | { | 1103 | { |
| 1025 | unsigned long flags; | 1104 | unsigned long flags; |
| @@ -1035,14 +1114,16 @@ void gigaset_freedriver(struct gigaset_driver *drv) | |||
| 1035 | } | 1114 | } |
| 1036 | EXPORT_SYMBOL_GPL(gigaset_freedriver); | 1115 | EXPORT_SYMBOL_GPL(gigaset_freedriver); |
| 1037 | 1116 | ||
| 1038 | /* gigaset_initdriver | 1117 | /** |
| 1118 | * gigaset_initdriver() - initialize driver structure | ||
| 1119 | * @minor: First minor number | ||
| 1120 | * @minors: Number of minors this driver can handle | ||
| 1121 | * @procname: Name of the driver | ||
| 1122 | * @devname: Name of the device files (prefix without minor number) | ||
| 1123 | * | ||
| 1039 | * Allocate and initialize gigaset_driver structure. Initialize interface. | 1124 | * Allocate and initialize gigaset_driver structure. Initialize interface. |
| 1040 | * parameters: | 1125 | * |
| 1041 | * minor First minor number | 1126 | * Return value: |
| 1042 | * minors Number of minors this driver can handle | ||
| 1043 | * procname Name of the driver | ||
| 1044 | * devname Name of the device files (prefix without minor number) | ||
| 1045 | * return value: | ||
| 1046 | * Pointer to the gigaset_driver structure on success, NULL on failure. | 1127 | * Pointer to the gigaset_driver structure on success, NULL on failure. |
| 1047 | */ | 1128 | */ |
| 1048 | struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors, | 1129 | struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors, |
| @@ -1095,6 +1176,13 @@ error: | |||
| 1095 | } | 1176 | } |
| 1096 | EXPORT_SYMBOL_GPL(gigaset_initdriver); | 1177 | EXPORT_SYMBOL_GPL(gigaset_initdriver); |
| 1097 | 1178 | ||
| 1179 | /** | ||
| 1180 | * gigaset_blockdriver() - block driver | ||
| 1181 | * @drv: driver descriptor structure. | ||
| 1182 | * | ||
| 1183 | * Prevents the driver from attaching new devices, in preparation for | ||
| 1184 | * deregistration. | ||
| 1185 | */ | ||
| 1098 | void gigaset_blockdriver(struct gigaset_driver *drv) | 1186 | void gigaset_blockdriver(struct gigaset_driver *drv) |
| 1099 | { | 1187 | { |
| 1100 | drv->blocked = 1; | 1188 | drv->blocked = 1; |
| @@ -1110,7 +1198,7 @@ static int __init gigaset_init_module(void) | |||
| 1110 | if (gigaset_debuglevel == 1) | 1198 | if (gigaset_debuglevel == 1) |
| 1111 | gigaset_debuglevel = DEBUG_DEFAULT; | 1199 | gigaset_debuglevel = DEBUG_DEFAULT; |
| 1112 | 1200 | ||
| 1113 | pr_info(DRIVER_DESC "\n"); | 1201 | pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n"); |
| 1114 | return 0; | 1202 | return 0; |
| 1115 | } | 1203 | } |
| 1116 | 1204 | ||
diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index 2d91049571a4..cc768caa38f5 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c | |||
| @@ -207,7 +207,6 @@ struct reply_t gigaset_tab_nocid[] = | |||
| 207 | /* leave dle mode */ | 207 | /* leave dle mode */ |
| 208 | {RSP_INIT, 0, 0,SEQ_DLE0, 201, 5, {0}, "^SDLE=0\r"}, | 208 | {RSP_INIT, 0, 0,SEQ_DLE0, 201, 5, {0}, "^SDLE=0\r"}, |
| 209 | {RSP_OK, 201,201, -1, 202,-1}, | 209 | {RSP_OK, 201,201, -1, 202,-1}, |
| 210 | //{RSP_ZDLE, 202,202, 0, 202, 0, {ACT_ERROR}},//DELETE | ||
| 211 | {RSP_ZDLE, 202,202, 0, 0, 0, {ACT_DLE0}}, | 210 | {RSP_ZDLE, 202,202, 0, 0, 0, {ACT_DLE0}}, |
| 212 | {RSP_NODEV, 200,249, -1, 0, 0, {ACT_FAKEDLE0}}, | 211 | {RSP_NODEV, 200,249, -1, 0, 0, {ACT_FAKEDLE0}}, |
| 213 | {RSP_ERROR, 200,249, -1, 0, 0, {ACT_FAILDLE0}}, | 212 | {RSP_ERROR, 200,249, -1, 0, 0, {ACT_FAILDLE0}}, |
| @@ -265,6 +264,7 @@ struct reply_t gigaset_tab_nocid[] = | |||
| 265 | {EV_SHUTDOWN, -1, -1, -1, -1,-1, {ACT_SHUTDOWN}}, //FIXME | 264 | {EV_SHUTDOWN, -1, -1, -1, -1,-1, {ACT_SHUTDOWN}}, //FIXME |
| 266 | 265 | ||
| 267 | /* misc. */ | 266 | /* misc. */ |
| 267 | {RSP_ERROR, -1, -1, -1, -1, -1, {ACT_ERROR} }, | ||
| 268 | {RSP_EMPTY, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME | 268 | {RSP_EMPTY, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME |
| 269 | {RSP_ZCFGT, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME | 269 | {RSP_ZCFGT, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME |
| 270 | {RSP_ZCFG, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME | 270 | {RSP_ZCFG, -1, -1, -1, -1,-1, {ACT_DEBUG}}, //FIXME |
| @@ -328,10 +328,9 @@ struct reply_t gigaset_tab_cid[] = | |||
| 328 | {RSP_INIT, -1, -1,SEQ_HUP, 401, 5, {0}, "+VLS=0\r"}, /* hang up */ //-1,-1? | 328 | {RSP_INIT, -1, -1,SEQ_HUP, 401, 5, {0}, "+VLS=0\r"}, /* hang up */ //-1,-1? |
| 329 | {RSP_OK, 401,401, -1, 402, 5}, | 329 | {RSP_OK, 401,401, -1, 402, 5}, |
| 330 | {RSP_ZVLS, 402,402, 0, 403, 5}, | 330 | {RSP_ZVLS, 402,402, 0, 403, 5}, |
| 331 | {RSP_ZSAU, 403,403,ZSAU_DISCONNECT_REQ, -1,-1, {ACT_DEBUG}}, /* if not remote hup */ | 331 | {RSP_ZSAU, 403, 403, ZSAU_DISCONNECT_REQ, -1, -1, {ACT_DEBUG} }, |
| 332 | //{RSP_ZSAU, 403,403,ZSAU_NULL, 401, 0, {ACT_ERROR}}, //DELETE//FIXME -> DLE0 // should we do this _before_ hanging up for base driver? | 332 | {RSP_ZSAU, 403, 403, ZSAU_NULL, 0, 0, {ACT_DISCONNECT} }, |
| 333 | {RSP_ZSAU, 403,403,ZSAU_NULL, 0, 0, {ACT_DISCONNECT}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver? | 333 | {RSP_NODEV, 401, 403, -1, 0, 0, {ACT_FAKEHUP} }, |
| 334 | {RSP_NODEV, 401,403, -1, 0, 0, {ACT_FAKEHUP}}, //FIXME -> DLE0 // should we do this _before_ hanging up for base driver? | ||
| 335 | {RSP_ERROR, 401,401, -1, 0, 0, {ACT_ABORTHUP}}, | 334 | {RSP_ERROR, 401,401, -1, 0, 0, {ACT_ABORTHUP}}, |
| 336 | {EV_TIMEOUT, 401,403, -1, 0, 0, {ACT_ABORTHUP}}, | 335 | {EV_TIMEOUT, 401,403, -1, 0, 0, {ACT_ABORTHUP}}, |
| 337 | 336 | ||
| @@ -474,8 +473,13 @@ static int cid_of_response(char *s) | |||
| 474 | //FIXME is ;<digit>+ at end of non-CID response really impossible? | 473 | //FIXME is ;<digit>+ at end of non-CID response really impossible? |
| 475 | } | 474 | } |
| 476 | 475 | ||
| 477 | /* This function will be called via task queue from the callback handler. | 476 | /** |
| 478 | * We received a modem response and have to handle it.. | 477 | * gigaset_handle_modem_response() - process received modem response |
| 478 | * @cs: device descriptor structure. | ||
| 479 | * | ||
| 480 | * Called by asyncdata/isocdata if a block of data received from the | ||
| 481 | * device must be processed as a modem command response. The data is | ||
| 482 | * already in the cs structure. | ||
| 479 | */ | 483 | */ |
| 480 | void gigaset_handle_modem_response(struct cardstate *cs) | 484 | void gigaset_handle_modem_response(struct cardstate *cs) |
| 481 | { | 485 | { |
| @@ -707,6 +711,11 @@ static void disconnect(struct at_state_t **at_state_p) | |||
| 707 | if (bcs) { | 711 | if (bcs) { |
| 708 | /* B channel assigned: invoke hardware specific handler */ | 712 | /* B channel assigned: invoke hardware specific handler */ |
| 709 | cs->ops->close_bchannel(bcs); | 713 | cs->ops->close_bchannel(bcs); |
| 714 | /* notify LL */ | ||
| 715 | if (bcs->chstate & (CHS_D_UP | CHS_NOTIFY_LL)) { | ||
| 716 | bcs->chstate &= ~(CHS_D_UP | CHS_NOTIFY_LL); | ||
| 717 | gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DHUP); | ||
| 718 | } | ||
| 710 | } else { | 719 | } else { |
| 711 | /* no B channel assigned: just deallocate */ | 720 | /* no B channel assigned: just deallocate */ |
| 712 | spin_lock_irqsave(&cs->lock, flags); | 721 | spin_lock_irqsave(&cs->lock, flags); |
| @@ -1429,11 +1438,12 @@ static void do_action(int action, struct cardstate *cs, | |||
| 1429 | cs->gotfwver = -1; | 1438 | cs->gotfwver = -1; |
| 1430 | dev_err(cs->dev, "could not read firmware version.\n"); | 1439 | dev_err(cs->dev, "could not read firmware version.\n"); |
| 1431 | break; | 1440 | break; |
| 1432 | #ifdef CONFIG_GIGASET_DEBUG | ||
| 1433 | case ACT_ERROR: | 1441 | case ACT_ERROR: |
| 1434 | *p_genresp = 1; | 1442 | gig_dbg(DEBUG_ANY, "%s: ERROR response in ConState %d", |
| 1435 | *p_resp_code = RSP_ERROR; | 1443 | __func__, at_state->ConState); |
| 1444 | cs->cur_at_seq = SEQ_NONE; | ||
| 1436 | break; | 1445 | break; |
| 1446 | #ifdef CONFIG_GIGASET_DEBUG | ||
| 1437 | case ACT_TEST: | 1447 | case ACT_TEST: |
| 1438 | { | 1448 | { |
| 1439 | static int count = 3; //2; //1; | 1449 | static int count = 3; //2; //1; |
diff --git a/drivers/isdn/gigaset/i4l.c b/drivers/isdn/gigaset/i4l.c index 9b22f9cf2f33..654489d836cd 100644 --- a/drivers/isdn/gigaset/i4l.c +++ b/drivers/isdn/gigaset/i4l.c | |||
| @@ -51,6 +51,12 @@ static int writebuf_from_LL(int driverID, int channel, int ack, | |||
| 51 | return -ENODEV; | 51 | return -ENODEV; |
| 52 | } | 52 | } |
| 53 | bcs = &cs->bcs[channel]; | 53 | bcs = &cs->bcs[channel]; |
| 54 | |||
| 55 | /* can only handle linear sk_buffs */ | ||
| 56 | if (skb_linearize(skb) < 0) { | ||
| 57 | dev_err(cs->dev, "%s: skb_linearize failed\n", __func__); | ||
| 58 | return -ENOMEM; | ||
| 59 | } | ||
| 54 | len = skb->len; | 60 | len = skb->len; |
| 55 | 61 | ||
| 56 | gig_dbg(DEBUG_LLDATA, | 62 | gig_dbg(DEBUG_LLDATA, |
| @@ -79,6 +85,14 @@ static int writebuf_from_LL(int driverID, int channel, int ack, | |||
| 79 | return cs->ops->send_skb(bcs, skb); | 85 | return cs->ops->send_skb(bcs, skb); |
| 80 | } | 86 | } |
| 81 | 87 | ||
| 88 | /** | ||
| 89 | * gigaset_skb_sent() - acknowledge sending an skb | ||
| 90 | * @bcs: B channel descriptor structure. | ||
| 91 | * @skb: sent data. | ||
| 92 | * | ||
| 93 | * Called by hardware module {bas,ser,usb}_gigaset when the data in a | ||
| 94 | * skb has been successfully sent, for signalling completion to the LL. | ||
| 95 | */ | ||
| 82 | void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb) | 96 | void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb) |
| 83 | { | 97 | { |
| 84 | unsigned len; | 98 | unsigned len; |
| @@ -455,6 +469,15 @@ int gigaset_isdn_setup_accept(struct at_state_t *at_state) | |||
| 455 | return 0; | 469 | return 0; |
| 456 | } | 470 | } |
| 457 | 471 | ||
| 472 | /** | ||
| 473 | * gigaset_isdn_icall() - signal incoming call | ||
| 474 | * @at_state: connection state structure. | ||
| 475 | * | ||
| 476 | * Called by main module to notify the LL that an incoming call has been | ||
| 477 | * received. @at_state contains the parameters of the call. | ||
| 478 | * | ||
| 479 | * Return value: call disposition (ICALL_*) | ||
| 480 | */ | ||
| 458 | int gigaset_isdn_icall(struct at_state_t *at_state) | 481 | int gigaset_isdn_icall(struct at_state_t *at_state) |
| 459 | { | 482 | { |
| 460 | struct cardstate *cs = at_state->cs; | 483 | struct cardstate *cs = at_state->cs; |
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index f33ac27de643..6a8e1384e7bd 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c | |||
| @@ -616,6 +616,15 @@ void gigaset_if_free(struct cardstate *cs) | |||
| 616 | tty_unregister_device(drv->tty, cs->minor_index); | 616 | tty_unregister_device(drv->tty, cs->minor_index); |
| 617 | } | 617 | } |
| 618 | 618 | ||
| 619 | /** | ||
| 620 | * gigaset_if_receive() - pass a received block of data to the tty device | ||
| 621 | * @cs: device descriptor structure. | ||
| 622 | * @buffer: received data. | ||
| 623 | * @len: number of bytes received. | ||
| 624 | * | ||
| 625 | * Called by asyncdata/isocdata if a block of data received from the | ||
| 626 | * device must be sent to userspace through the ttyG* device. | ||
| 627 | */ | ||
| 619 | void gigaset_if_receive(struct cardstate *cs, | 628 | void gigaset_if_receive(struct cardstate *cs, |
| 620 | unsigned char *buffer, size_t len) | 629 | unsigned char *buffer, size_t len) |
| 621 | { | 630 | { |
diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c index bed38fcc432b..9f3ef7b4248c 100644 --- a/drivers/isdn/gigaset/isocdata.c +++ b/drivers/isdn/gigaset/isocdata.c | |||
| @@ -429,7 +429,7 @@ static inline int hdlc_buildframe(struct isowbuf_t *iwb, | |||
| 429 | return -EAGAIN; | 429 | return -EAGAIN; |
| 430 | } | 430 | } |
| 431 | 431 | ||
| 432 | dump_bytes(DEBUG_STREAM, "snd data", in, count); | 432 | dump_bytes(DEBUG_STREAM_DUMP, "snd data", in, count); |
| 433 | 433 | ||
| 434 | /* bitstuff and checksum input data */ | 434 | /* bitstuff and checksum input data */ |
| 435 | fcs = PPP_INITFCS; | 435 | fcs = PPP_INITFCS; |
| @@ -448,7 +448,6 @@ static inline int hdlc_buildframe(struct isowbuf_t *iwb, | |||
| 448 | /* put closing flag and repeat byte for flag idle */ | 448 | /* put closing flag and repeat byte for flag idle */ |
| 449 | isowbuf_putflag(iwb); | 449 | isowbuf_putflag(iwb); |
| 450 | end = isowbuf_donewrite(iwb); | 450 | end = isowbuf_donewrite(iwb); |
| 451 | dump_bytes(DEBUG_STREAM_DUMP, "isowbuf", iwb->data, end + 1); | ||
| 452 | return end; | 451 | return end; |
| 453 | } | 452 | } |
| 454 | 453 | ||
| @@ -482,6 +481,8 @@ static inline int trans_buildframe(struct isowbuf_t *iwb, | |||
| 482 | } | 481 | } |
| 483 | 482 | ||
| 484 | gig_dbg(DEBUG_STREAM, "put %d bytes", count); | 483 | gig_dbg(DEBUG_STREAM, "put %d bytes", count); |
| 484 | dump_bytes(DEBUG_STREAM_DUMP, "snd data", in, count); | ||
| 485 | |||
| 485 | write = iwb->write; | 486 | write = iwb->write; |
| 486 | do { | 487 | do { |
| 487 | c = bitrev8(*in++); | 488 | c = bitrev8(*in++); |
| @@ -583,7 +584,7 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 583 | procskb->tail -= 2; | 584 | procskb->tail -= 2; |
| 584 | gig_dbg(DEBUG_ISO, "%s: good frame (%d octets)", | 585 | gig_dbg(DEBUG_ISO, "%s: good frame (%d octets)", |
| 585 | __func__, procskb->len); | 586 | __func__, procskb->len); |
| 586 | dump_bytes(DEBUG_STREAM, | 587 | dump_bytes(DEBUG_STREAM_DUMP, |
| 587 | "rcv data", procskb->data, procskb->len); | 588 | "rcv data", procskb->data, procskb->len); |
| 588 | bcs->hw.bas->goodbytes += procskb->len; | 589 | bcs->hw.bas->goodbytes += procskb->len; |
| 589 | gigaset_rcv_skb(procskb, bcs->cs, bcs); | 590 | gigaset_rcv_skb(procskb, bcs->cs, bcs); |
| @@ -878,6 +879,8 @@ static inline void trans_receive(unsigned char *src, unsigned count, | |||
| 878 | dobytes--; | 879 | dobytes--; |
| 879 | } | 880 | } |
| 880 | if (dobytes == 0) { | 881 | if (dobytes == 0) { |
| 882 | dump_bytes(DEBUG_STREAM_DUMP, | ||
| 883 | "rcv data", skb->data, skb->len); | ||
| 881 | gigaset_rcv_skb(skb, bcs->cs, bcs); | 884 | gigaset_rcv_skb(skb, bcs->cs, bcs); |
| 882 | bcs->skb = skb = dev_alloc_skb(SBUFSIZE + HW_HDR_LEN); | 885 | bcs->skb = skb = dev_alloc_skb(SBUFSIZE + HW_HDR_LEN); |
| 883 | if (!skb) { | 886 | if (!skb) { |
| @@ -973,16 +976,17 @@ void gigaset_isoc_input(struct inbuf_t *inbuf) | |||
| 973 | 976 | ||
| 974 | /* == data output ========================================================== */ | 977 | /* == data output ========================================================== */ |
| 975 | 978 | ||
| 976 | /* gigaset_send_skb | 979 | /** |
| 977 | * called by common.c to queue an skb for sending | 980 | * gigaset_isoc_send_skb() - queue an skb for sending |
| 978 | * and start transmission if necessary | 981 | * @bcs: B channel descriptor structure. |
| 979 | * parameters: | 982 | * @skb: data to send. |
| 980 | * B Channel control structure | 983 | * |
| 981 | * skb | 984 | * Called by i4l.c to queue an skb for sending, and start transmission if |
| 982 | * return value: | 985 | * necessary. |
| 983 | * number of bytes accepted for sending | 986 | * |
| 984 | * (skb->len if ok, 0 if out of buffer space) | 987 | * Return value: |
| 985 | * or error code (< 0, eg. -EINVAL) | 988 | * number of bytes accepted for sending (skb->len) if ok, |
| 989 | * error code < 0 (eg. -ENODEV) on error | ||
| 986 | */ | 990 | */ |
| 987 | int gigaset_isoc_send_skb(struct bc_state *bcs, struct sk_buff *skb) | 991 | int gigaset_isoc_send_skb(struct bc_state *bcs, struct sk_buff *skb) |
| 988 | { | 992 | { |
diff --git a/drivers/mmc/core/sdio_cis.c b/drivers/mmc/core/sdio_cis.c index e1035c895808..f85dcd536508 100644 --- a/drivers/mmc/core/sdio_cis.c +++ b/drivers/mmc/core/sdio_cis.c | |||
| @@ -29,6 +29,8 @@ static int cistpl_vers_1(struct mmc_card *card, struct sdio_func *func, | |||
| 29 | unsigned i, nr_strings; | 29 | unsigned i, nr_strings; |
| 30 | char **buffer, *string; | 30 | char **buffer, *string; |
| 31 | 31 | ||
| 32 | /* Find all null-terminated (including zero length) strings in | ||
| 33 | the TPLLV1_INFO field. Trailing garbage is ignored. */ | ||
| 32 | buf += 2; | 34 | buf += 2; |
| 33 | size -= 2; | 35 | size -= 2; |
| 34 | 36 | ||
| @@ -39,11 +41,8 @@ static int cistpl_vers_1(struct mmc_card *card, struct sdio_func *func, | |||
| 39 | if (buf[i] == 0) | 41 | if (buf[i] == 0) |
| 40 | nr_strings++; | 42 | nr_strings++; |
| 41 | } | 43 | } |
| 42 | 44 | if (nr_strings == 0) | |
| 43 | if (nr_strings < 4) { | ||
| 44 | printk(KERN_WARNING "SDIO: ignoring broken CISTPL_VERS_1\n"); | ||
| 45 | return 0; | 45 | return 0; |
| 46 | } | ||
| 47 | 46 | ||
| 48 | size = i; | 47 | size = i; |
| 49 | 48 | ||
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index fdf5937233fc..04f63c77071d 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
| @@ -721,7 +721,7 @@ static inline void update_rx_stats(struct net_device *dev, u32 status) | |||
| 721 | ps->rx_errors++; | 721 | ps->rx_errors++; |
| 722 | if (status & RX_MISSED_FRAME) | 722 | if (status & RX_MISSED_FRAME) |
| 723 | ps->rx_missed_errors++; | 723 | ps->rx_missed_errors++; |
| 724 | if (status & (RX_OVERLEN | RX_OVERLEN | RX_LEN_ERROR)) | 724 | if (status & (RX_OVERLEN | RX_RUNT | RX_LEN_ERROR)) |
| 725 | ps->rx_length_errors++; | 725 | ps->rx_length_errors++; |
| 726 | if (status & RX_CRC_ERROR) | 726 | if (status & RX_CRC_ERROR) |
| 727 | ps->rx_crc_errors++; | 727 | ps->rx_crc_errors++; |
| @@ -794,8 +794,6 @@ static int au1000_rx(struct net_device *dev) | |||
| 794 | printk("rx len error\n"); | 794 | printk("rx len error\n"); |
| 795 | if (status & RX_U_CNTRL_FRAME) | 795 | if (status & RX_U_CNTRL_FRAME) |
| 796 | printk("rx u control frame\n"); | 796 | printk("rx u control frame\n"); |
| 797 | if (status & RX_MISSED_FRAME) | ||
| 798 | printk("rx miss\n"); | ||
| 799 | } | 797 | } |
| 800 | } | 798 | } |
| 801 | prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE); | 799 | prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE); |
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 79d35d122c08..89876ade5e33 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
| @@ -1129,7 +1129,6 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, | |||
| 1129 | spin_lock_bh(&adapter->mcc_lock); | 1129 | spin_lock_bh(&adapter->mcc_lock); |
| 1130 | 1130 | ||
| 1131 | wrb = wrb_from_mccq(adapter); | 1131 | wrb = wrb_from_mccq(adapter); |
| 1132 | req = embedded_payload(wrb); | ||
| 1133 | sge = nonembedded_sgl(wrb); | 1132 | sge = nonembedded_sgl(wrb); |
| 1134 | 1133 | ||
| 1135 | be_wrb_hdr_prepare(wrb, cmd->size, false, 1); | 1134 | be_wrb_hdr_prepare(wrb, cmd->size, false, 1); |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index 8b4c2cb9ad62..a86f917f85f4 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -62,7 +62,7 @@ enum { | |||
| 62 | MCC_STATUS_QUEUE_FLUSHING = 0x4, | 62 | MCC_STATUS_QUEUE_FLUSHING = 0x4, |
| 63 | /* The command is completing with a DMA error */ | 63 | /* The command is completing with a DMA error */ |
| 64 | MCC_STATUS_DMA_FAILED = 0x5, | 64 | MCC_STATUS_DMA_FAILED = 0x5, |
| 65 | MCC_STATUS_NOT_SUPPORTED = 0x66 | 65 | MCC_STATUS_NOT_SUPPORTED = 66 |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | #define CQE_STATUS_COMPL_MASK 0xFFFF | 68 | #define CQE_STATUS_COMPL_MASK 0xFFFF |
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index 11445df3dbc0..cda5bf2fc50a 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
| @@ -358,7 +358,7 @@ const struct ethtool_ops be_ethtool_ops = { | |||
| 358 | .get_rx_csum = be_get_rx_csum, | 358 | .get_rx_csum = be_get_rx_csum, |
| 359 | .set_rx_csum = be_set_rx_csum, | 359 | .set_rx_csum = be_set_rx_csum, |
| 360 | .get_tx_csum = ethtool_op_get_tx_csum, | 360 | .get_tx_csum = ethtool_op_get_tx_csum, |
| 361 | .set_tx_csum = ethtool_op_set_tx_csum, | 361 | .set_tx_csum = ethtool_op_set_tx_hw_csum, |
| 362 | .get_sg = ethtool_op_get_sg, | 362 | .get_sg = ethtool_op_get_sg, |
| 363 | .set_sg = ethtool_op_set_sg, | 363 | .set_sg = ethtool_op_set_sg, |
| 364 | .get_tso = ethtool_op_get_tso, | 364 | .get_tso = ethtool_op_get_tso, |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 2f9b50156e0c..6d5e81f7046f 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -197,7 +197,7 @@ void netdev_stats_update(struct be_adapter *adapter) | |||
| 197 | /* no space available in linux */ | 197 | /* no space available in linux */ |
| 198 | dev_stats->tx_dropped = 0; | 198 | dev_stats->tx_dropped = 0; |
| 199 | 199 | ||
| 200 | dev_stats->multicast = port_stats->tx_multicastframes; | 200 | dev_stats->multicast = port_stats->rx_multicast_frames; |
| 201 | dev_stats->collisions = 0; | 201 | dev_stats->collisions = 0; |
| 202 | 202 | ||
| 203 | /* detailed tx_errors */ | 203 | /* detailed tx_errors */ |
| @@ -1899,8 +1899,8 @@ static void be_netdev_init(struct net_device *netdev) | |||
| 1899 | struct be_adapter *adapter = netdev_priv(netdev); | 1899 | struct be_adapter *adapter = netdev_priv(netdev); |
| 1900 | 1900 | ||
| 1901 | netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO | | 1901 | netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO | |
| 1902 | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM | | 1902 | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_HW_CSUM | |
| 1903 | NETIF_F_IPV6_CSUM | NETIF_F_GRO; | 1903 | NETIF_F_GRO; |
| 1904 | 1904 | ||
| 1905 | netdev->flags |= IFF_MULTICAST; | 1905 | netdev->flags |= IFF_MULTICAST; |
| 1906 | 1906 | ||
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c index b53b40ba88a8..d1e0563a67df 100644 --- a/drivers/net/e1000e/82571.c +++ b/drivers/net/e1000e/82571.c | |||
| @@ -1803,7 +1803,7 @@ struct e1000_info e1000_82574_info = { | |||
| 1803 | | FLAG_HAS_AMT | 1803 | | FLAG_HAS_AMT |
| 1804 | | FLAG_HAS_CTRLEXT_ON_LOAD, | 1804 | | FLAG_HAS_CTRLEXT_ON_LOAD, |
| 1805 | .pba = 20, | 1805 | .pba = 20, |
| 1806 | .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN, | 1806 | .max_hw_frame_size = DEFAULT_JUMBO, |
| 1807 | .get_variants = e1000_get_variants_82571, | 1807 | .get_variants = e1000_get_variants_82571, |
| 1808 | .mac_ops = &e82571_mac_ops, | 1808 | .mac_ops = &e82571_mac_ops, |
| 1809 | .phy_ops = &e82_phy_ops_bm, | 1809 | .phy_ops = &e82_phy_ops_bm, |
| @@ -1820,7 +1820,7 @@ struct e1000_info e1000_82583_info = { | |||
| 1820 | | FLAG_HAS_AMT | 1820 | | FLAG_HAS_AMT |
| 1821 | | FLAG_HAS_CTRLEXT_ON_LOAD, | 1821 | | FLAG_HAS_CTRLEXT_ON_LOAD, |
| 1822 | .pba = 20, | 1822 | .pba = 20, |
| 1823 | .max_hw_frame_size = DEFAULT_JUMBO, | 1823 | .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN, |
| 1824 | .get_variants = e1000_get_variants_82571, | 1824 | .get_variants = e1000_get_variants_82571, |
| 1825 | .mac_ops = &e82571_mac_ops, | 1825 | .mac_ops = &e82571_mac_ops, |
| 1826 | .phy_ops = &e82_phy_ops_bm, | 1826 | .phy_ops = &e82_phy_ops_bm, |
diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index b7311bc00258..34d0c69e67f7 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c | |||
| @@ -19,6 +19,10 @@ | |||
| 19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 20 | #include <net/ethoc.h> | 20 | #include <net/ethoc.h> |
| 21 | 21 | ||
| 22 | static int buffer_size = 0x8000; /* 32 KBytes */ | ||
| 23 | module_param(buffer_size, int, 0); | ||
| 24 | MODULE_PARM_DESC(buffer_size, "DMA buffer allocation size"); | ||
| 25 | |||
| 22 | /* register offsets */ | 26 | /* register offsets */ |
| 23 | #define MODER 0x00 | 27 | #define MODER 0x00 |
| 24 | #define INT_SOURCE 0x04 | 28 | #define INT_SOURCE 0x04 |
| @@ -167,6 +171,7 @@ | |||
| 167 | * struct ethoc - driver-private device structure | 171 | * struct ethoc - driver-private device structure |
| 168 | * @iobase: pointer to I/O memory region | 172 | * @iobase: pointer to I/O memory region |
| 169 | * @membase: pointer to buffer memory region | 173 | * @membase: pointer to buffer memory region |
| 174 | * @dma_alloc: dma allocated buffer size | ||
| 170 | * @num_tx: number of send buffers | 175 | * @num_tx: number of send buffers |
| 171 | * @cur_tx: last send buffer written | 176 | * @cur_tx: last send buffer written |
| 172 | * @dty_tx: last buffer actually sent | 177 | * @dty_tx: last buffer actually sent |
| @@ -185,6 +190,7 @@ | |||
| 185 | struct ethoc { | 190 | struct ethoc { |
| 186 | void __iomem *iobase; | 191 | void __iomem *iobase; |
| 187 | void __iomem *membase; | 192 | void __iomem *membase; |
| 193 | int dma_alloc; | ||
| 188 | 194 | ||
| 189 | unsigned int num_tx; | 195 | unsigned int num_tx; |
| 190 | unsigned int cur_tx; | 196 | unsigned int cur_tx; |
| @@ -284,7 +290,7 @@ static int ethoc_init_ring(struct ethoc *dev) | |||
| 284 | dev->cur_rx = 0; | 290 | dev->cur_rx = 0; |
| 285 | 291 | ||
| 286 | /* setup transmission buffers */ | 292 | /* setup transmission buffers */ |
| 287 | bd.addr = 0; | 293 | bd.addr = virt_to_phys(dev->membase); |
| 288 | bd.stat = TX_BD_IRQ | TX_BD_CRC; | 294 | bd.stat = TX_BD_IRQ | TX_BD_CRC; |
| 289 | 295 | ||
| 290 | for (i = 0; i < dev->num_tx; i++) { | 296 | for (i = 0; i < dev->num_tx; i++) { |
| @@ -295,7 +301,6 @@ static int ethoc_init_ring(struct ethoc *dev) | |||
| 295 | bd.addr += ETHOC_BUFSIZ; | 301 | bd.addr += ETHOC_BUFSIZ; |
| 296 | } | 302 | } |
| 297 | 303 | ||
| 298 | bd.addr = dev->num_tx * ETHOC_BUFSIZ; | ||
| 299 | bd.stat = RX_BD_EMPTY | RX_BD_IRQ; | 304 | bd.stat = RX_BD_EMPTY | RX_BD_IRQ; |
| 300 | 305 | ||
| 301 | for (i = 0; i < dev->num_rx; i++) { | 306 | for (i = 0; i < dev->num_rx; i++) { |
| @@ -400,8 +405,12 @@ static int ethoc_rx(struct net_device *dev, int limit) | |||
| 400 | if (ethoc_update_rx_stats(priv, &bd) == 0) { | 405 | if (ethoc_update_rx_stats(priv, &bd) == 0) { |
| 401 | int size = bd.stat >> 16; | 406 | int size = bd.stat >> 16; |
| 402 | struct sk_buff *skb = netdev_alloc_skb(dev, size); | 407 | struct sk_buff *skb = netdev_alloc_skb(dev, size); |
| 408 | |||
| 409 | size -= 4; /* strip the CRC */ | ||
| 410 | skb_reserve(skb, 2); /* align TCP/IP header */ | ||
| 411 | |||
| 403 | if (likely(skb)) { | 412 | if (likely(skb)) { |
| 404 | void *src = priv->membase + bd.addr; | 413 | void *src = phys_to_virt(bd.addr); |
| 405 | memcpy_fromio(skb_put(skb, size), src, size); | 414 | memcpy_fromio(skb_put(skb, size), src, size); |
| 406 | skb->protocol = eth_type_trans(skb, dev); | 415 | skb->protocol = eth_type_trans(skb, dev); |
| 407 | priv->stats.rx_packets++; | 416 | priv->stats.rx_packets++; |
| @@ -653,9 +662,9 @@ static int ethoc_open(struct net_device *dev) | |||
| 653 | if (ret) | 662 | if (ret) |
| 654 | return ret; | 663 | return ret; |
| 655 | 664 | ||
| 656 | /* calculate the number of TX/RX buffers */ | 665 | /* calculate the number of TX/RX buffers, maximum 128 supported */ |
| 657 | num_bd = (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ; | 666 | num_bd = min(128, (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ); |
| 658 | priv->num_tx = min(min_tx, num_bd / 4); | 667 | priv->num_tx = max(min_tx, num_bd / 4); |
| 659 | priv->num_rx = num_bd - priv->num_tx; | 668 | priv->num_rx = num_bd - priv->num_tx; |
| 660 | ethoc_write(priv, TX_BD_NUM, priv->num_tx); | 669 | ethoc_write(priv, TX_BD_NUM, priv->num_tx); |
| 661 | 670 | ||
| @@ -823,7 +832,7 @@ static netdev_tx_t ethoc_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 823 | else | 832 | else |
| 824 | bd.stat &= ~TX_BD_PAD; | 833 | bd.stat &= ~TX_BD_PAD; |
| 825 | 834 | ||
| 826 | dest = priv->membase + bd.addr; | 835 | dest = phys_to_virt(bd.addr); |
| 827 | memcpy_toio(dest, skb->data, skb->len); | 836 | memcpy_toio(dest, skb->data, skb->len); |
| 828 | 837 | ||
| 829 | bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK); | 838 | bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK); |
| @@ -903,22 +912,19 @@ static int ethoc_probe(struct platform_device *pdev) | |||
| 903 | 912 | ||
| 904 | /* obtain buffer memory space */ | 913 | /* obtain buffer memory space */ |
| 905 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 914 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| 906 | if (!res) { | 915 | if (res) { |
| 907 | dev_err(&pdev->dev, "cannot obtain memory space\n"); | 916 | mem = devm_request_mem_region(&pdev->dev, res->start, |
| 908 | ret = -ENXIO; | ||
| 909 | goto free; | ||
| 910 | } | ||
| 911 | |||
| 912 | mem = devm_request_mem_region(&pdev->dev, res->start, | ||
| 913 | res->end - res->start + 1, res->name); | 917 | res->end - res->start + 1, res->name); |
| 914 | if (!mem) { | 918 | if (!mem) { |
| 915 | dev_err(&pdev->dev, "cannot request memory space\n"); | 919 | dev_err(&pdev->dev, "cannot request memory space\n"); |
| 916 | ret = -ENXIO; | 920 | ret = -ENXIO; |
| 917 | goto free; | 921 | goto free; |
| 922 | } | ||
| 923 | |||
| 924 | netdev->mem_start = mem->start; | ||
| 925 | netdev->mem_end = mem->end; | ||
| 918 | } | 926 | } |
| 919 | 927 | ||
| 920 | netdev->mem_start = mem->start; | ||
| 921 | netdev->mem_end = mem->end; | ||
| 922 | 928 | ||
| 923 | /* obtain device IRQ number */ | 929 | /* obtain device IRQ number */ |
| 924 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 930 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| @@ -933,6 +939,7 @@ static int ethoc_probe(struct platform_device *pdev) | |||
| 933 | /* setup driver-private data */ | 939 | /* setup driver-private data */ |
| 934 | priv = netdev_priv(netdev); | 940 | priv = netdev_priv(netdev); |
| 935 | priv->netdev = netdev; | 941 | priv->netdev = netdev; |
| 942 | priv->dma_alloc = 0; | ||
| 936 | 943 | ||
| 937 | priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr, | 944 | priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr, |
| 938 | mmio->end - mmio->start + 1); | 945 | mmio->end - mmio->start + 1); |
| @@ -942,12 +949,27 @@ static int ethoc_probe(struct platform_device *pdev) | |||
| 942 | goto error; | 949 | goto error; |
| 943 | } | 950 | } |
| 944 | 951 | ||
| 945 | priv->membase = devm_ioremap_nocache(&pdev->dev, netdev->mem_start, | 952 | if (netdev->mem_end) { |
| 946 | mem->end - mem->start + 1); | 953 | priv->membase = devm_ioremap_nocache(&pdev->dev, |
| 947 | if (!priv->membase) { | 954 | netdev->mem_start, mem->end - mem->start + 1); |
| 948 | dev_err(&pdev->dev, "cannot remap memory space\n"); | 955 | if (!priv->membase) { |
| 949 | ret = -ENXIO; | 956 | dev_err(&pdev->dev, "cannot remap memory space\n"); |
| 950 | goto error; | 957 | ret = -ENXIO; |
| 958 | goto error; | ||
| 959 | } | ||
| 960 | } else { | ||
| 961 | /* Allocate buffer memory */ | ||
| 962 | priv->membase = dma_alloc_coherent(NULL, | ||
| 963 | buffer_size, (void *)&netdev->mem_start, | ||
| 964 | GFP_KERNEL); | ||
| 965 | if (!priv->membase) { | ||
| 966 | dev_err(&pdev->dev, "cannot allocate %dB buffer\n", | ||
| 967 | buffer_size); | ||
| 968 | ret = -ENOMEM; | ||
| 969 | goto error; | ||
| 970 | } | ||
| 971 | netdev->mem_end = netdev->mem_start + buffer_size; | ||
| 972 | priv->dma_alloc = buffer_size; | ||
| 951 | } | 973 | } |
| 952 | 974 | ||
| 953 | /* Allow the platform setup code to pass in a MAC address. */ | 975 | /* Allow the platform setup code to pass in a MAC address. */ |
| @@ -1034,6 +1056,9 @@ free_mdio: | |||
| 1034 | kfree(priv->mdio->irq); | 1056 | kfree(priv->mdio->irq); |
| 1035 | mdiobus_free(priv->mdio); | 1057 | mdiobus_free(priv->mdio); |
| 1036 | free: | 1058 | free: |
| 1059 | if (priv->dma_alloc) | ||
| 1060 | dma_free_coherent(NULL, priv->dma_alloc, priv->membase, | ||
| 1061 | netdev->mem_start); | ||
| 1037 | free_netdev(netdev); | 1062 | free_netdev(netdev); |
| 1038 | out: | 1063 | out: |
| 1039 | return ret; | 1064 | return ret; |
| @@ -1059,7 +1084,9 @@ static int ethoc_remove(struct platform_device *pdev) | |||
| 1059 | kfree(priv->mdio->irq); | 1084 | kfree(priv->mdio->irq); |
| 1060 | mdiobus_free(priv->mdio); | 1085 | mdiobus_free(priv->mdio); |
| 1061 | } | 1086 | } |
| 1062 | 1087 | if (priv->dma_alloc) | |
| 1088 | dma_free_coherent(NULL, priv->dma_alloc, priv->membase, | ||
| 1089 | netdev->mem_start); | ||
| 1063 | unregister_netdev(netdev); | 1090 | unregister_netdev(netdev); |
| 1064 | free_netdev(netdev); | 1091 | free_netdev(netdev); |
| 1065 | } | 1092 | } |
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index 2ec58dcdb82b..34b04924c8a1 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
| @@ -330,6 +330,8 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) | |||
| 330 | 330 | ||
| 331 | switch (hw->device_id) { | 331 | switch (hw->device_id) { |
| 332 | case IXGBE_DEV_ID_82599_KX4: | 332 | case IXGBE_DEV_ID_82599_KX4: |
| 333 | case IXGBE_DEV_ID_82599_KX4_MEZZ: | ||
| 334 | case IXGBE_DEV_ID_82599_COMBO_BACKPLANE: | ||
| 333 | case IXGBE_DEV_ID_82599_XAUI_LOM: | 335 | case IXGBE_DEV_ID_82599_XAUI_LOM: |
| 334 | /* Default device ID is mezzanine card KX/KX4 */ | 336 | /* Default device ID is mezzanine card KX/KX4 */ |
| 335 | media_type = ixgbe_media_type_backplane; | 337 | media_type = ixgbe_media_type_backplane; |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 28fbb9d281f9..cbb143ca1eb8 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -97,8 +97,12 @@ static struct pci_device_id ixgbe_pci_tbl[] = { | |||
| 97 | board_82599 }, | 97 | board_82599 }, |
| 98 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP), | 98 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP), |
| 99 | board_82599 }, | 99 | board_82599 }, |
| 100 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4_MEZZ), | ||
| 101 | board_82599 }, | ||
| 100 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4), | 102 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4), |
| 101 | board_82599 }, | 103 | board_82599 }, |
| 104 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_COMBO_BACKPLANE), | ||
| 105 | board_82599 }, | ||
| 102 | 106 | ||
| 103 | /* required last entry */ | 107 | /* required last entry */ |
| 104 | {0, } | 108 | {0, } |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index 7c93e923bf2e..ef4bdd58e016 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
| @@ -49,9 +49,11 @@ | |||
| 49 | #define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1 | 49 | #define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1 |
| 50 | #define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4 | 50 | #define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4 |
| 51 | #define IXGBE_DEV_ID_82599_KX4 0x10F7 | 51 | #define IXGBE_DEV_ID_82599_KX4 0x10F7 |
| 52 | #define IXGBE_DEV_ID_82599_KX4_MEZZ 0x1514 | ||
| 52 | #define IXGBE_DEV_ID_82599_CX4 0x10F9 | 53 | #define IXGBE_DEV_ID_82599_CX4 0x10F9 |
| 53 | #define IXGBE_DEV_ID_82599_SFP 0x10FB | 54 | #define IXGBE_DEV_ID_82599_SFP 0x10FB |
| 54 | #define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC | 55 | #define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC |
| 56 | #define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8 | ||
| 55 | 57 | ||
| 56 | /* General Registers */ | 58 | /* General Registers */ |
| 57 | #define IXGBE_CTRL 0x00000 | 59 | #define IXGBE_CTRL 0x00000 |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index b5aa974827e5..9b9eab107704 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -1714,7 +1714,7 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 1714 | /* 4 fragments per cmd des */ | 1714 | /* 4 fragments per cmd des */ |
| 1715 | no_of_desc = (frag_count + 3) >> 2; | 1715 | no_of_desc = (frag_count + 3) >> 2; |
| 1716 | 1716 | ||
| 1717 | if (unlikely(no_of_desc + 2) > netxen_tx_avail(tx_ring)) { | 1717 | if (unlikely(no_of_desc + 2 > netxen_tx_avail(tx_ring))) { |
| 1718 | netif_stop_queue(netdev); | 1718 | netif_stop_queue(netdev); |
| 1719 | return NETDEV_TX_BUSY; | 1719 | return NETDEV_TX_BUSY; |
| 1720 | } | 1720 | } |
diff --git a/drivers/net/pasemi_mac_ethtool.c b/drivers/net/pasemi_mac_ethtool.c index 064a4fe1dd90..28a86224879d 100644 --- a/drivers/net/pasemi_mac_ethtool.c +++ b/drivers/net/pasemi_mac_ethtool.c | |||
| @@ -71,6 +71,9 @@ pasemi_mac_ethtool_get_settings(struct net_device *netdev, | |||
| 71 | struct pasemi_mac *mac = netdev_priv(netdev); | 71 | struct pasemi_mac *mac = netdev_priv(netdev); |
| 72 | struct phy_device *phydev = mac->phydev; | 72 | struct phy_device *phydev = mac->phydev; |
| 73 | 73 | ||
| 74 | if (!phydev) | ||
| 75 | return -EOPNOTSUPP; | ||
| 76 | |||
| 74 | return phy_ethtool_gset(phydev, cmd); | 77 | return phy_ethtool_gset(phydev, cmd); |
| 75 | } | 78 | } |
| 76 | 79 | ||
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 474876c879cb..bd3447f04902 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -1754,14 +1754,14 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
| 1754 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 1754 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
| 1755 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 1755 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
| 1756 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 1756 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
| 1757 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"), | 1757 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
| 1758 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"), | 1758 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
| 1759 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"), | 1759 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), |
| 1760 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), | 1760 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), |
| 1761 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), | 1761 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), |
| 1762 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"), | 1762 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"), |
| 1763 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), | 1763 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), |
| 1764 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"), | 1764 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"), |
| 1765 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), | 1765 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), |
| 1766 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", | 1766 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", |
| 1767 | 0xb4be14e3, 0x43ac239b, 0x0877b627), | 1767 | 0xb4be14e3, 0x43ac239b, 0x0877b627), |
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 30d5585beeee..3ec6e85587a2 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | 9 | ||
| 10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
| 11 | #include <linux/netdevice.h> | 11 | #include <linux/netdevice.h> |
| 12 | #include <linux/rtnetlink.h> | ||
| 12 | 13 | ||
| 13 | /* | 14 | /* |
| 14 | * General definitions... | 15 | * General definitions... |
| @@ -135,9 +136,9 @@ enum { | |||
| 135 | RST_FO_TFO = (1 << 0), | 136 | RST_FO_TFO = (1 << 0), |
| 136 | RST_FO_RR_MASK = 0x00060000, | 137 | RST_FO_RR_MASK = 0x00060000, |
| 137 | RST_FO_RR_CQ_CAM = 0x00000000, | 138 | RST_FO_RR_CQ_CAM = 0x00000000, |
| 138 | RST_FO_RR_DROP = 0x00000001, | 139 | RST_FO_RR_DROP = 0x00000002, |
| 139 | RST_FO_RR_DQ = 0x00000002, | 140 | RST_FO_RR_DQ = 0x00000004, |
| 140 | RST_FO_RR_RCV_FUNC_CQ = 0x00000003, | 141 | RST_FO_RR_RCV_FUNC_CQ = 0x00000006, |
| 141 | RST_FO_FRB = (1 << 12), | 142 | RST_FO_FRB = (1 << 12), |
| 142 | RST_FO_MOP = (1 << 13), | 143 | RST_FO_MOP = (1 << 13), |
| 143 | RST_FO_REG = (1 << 14), | 144 | RST_FO_REG = (1 << 14), |
| @@ -1477,7 +1478,6 @@ struct ql_adapter { | |||
| 1477 | u32 mailbox_in; | 1478 | u32 mailbox_in; |
| 1478 | u32 mailbox_out; | 1479 | u32 mailbox_out; |
| 1479 | struct mbox_params idc_mbc; | 1480 | struct mbox_params idc_mbc; |
| 1480 | struct mutex mpi_mutex; | ||
| 1481 | 1481 | ||
| 1482 | int tx_ring_size; | 1482 | int tx_ring_size; |
| 1483 | int rx_ring_size; | 1483 | int rx_ring_size; |
diff --git a/drivers/net/qlge/qlge_ethtool.c b/drivers/net/qlge/qlge_ethtool.c index 68f9bd280f86..52073946bce3 100644 --- a/drivers/net/qlge/qlge_ethtool.c +++ b/drivers/net/qlge/qlge_ethtool.c | |||
| @@ -45,7 +45,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) | |||
| 45 | if (!netif_running(qdev->ndev)) | 45 | if (!netif_running(qdev->ndev)) |
| 46 | return status; | 46 | return status; |
| 47 | 47 | ||
| 48 | spin_lock(&qdev->hw_lock); | ||
| 49 | /* Skip the default queue, and update the outbound handler | 48 | /* Skip the default queue, and update the outbound handler |
| 50 | * queues if they changed. | 49 | * queues if they changed. |
| 51 | */ | 50 | */ |
| @@ -92,7 +91,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) | |||
| 92 | } | 91 | } |
| 93 | } | 92 | } |
| 94 | exit: | 93 | exit: |
| 95 | spin_unlock(&qdev->hw_lock); | ||
| 96 | return status; | 94 | return status; |
| 97 | } | 95 | } |
| 98 | 96 | ||
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 3d0efea32111..61680715cde0 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
| @@ -34,7 +34,6 @@ | |||
| 34 | #include <linux/etherdevice.h> | 34 | #include <linux/etherdevice.h> |
| 35 | #include <linux/ethtool.h> | 35 | #include <linux/ethtool.h> |
| 36 | #include <linux/skbuff.h> | 36 | #include <linux/skbuff.h> |
| 37 | #include <linux/rtnetlink.h> | ||
| 38 | #include <linux/if_vlan.h> | 37 | #include <linux/if_vlan.h> |
| 39 | #include <linux/delay.h> | 38 | #include <linux/delay.h> |
| 40 | #include <linux/mm.h> | 39 | #include <linux/mm.h> |
| @@ -1926,12 +1925,10 @@ static void ql_vlan_rx_add_vid(struct net_device *ndev, u16 vid) | |||
| 1926 | status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); | 1925 | status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); |
| 1927 | if (status) | 1926 | if (status) |
| 1928 | return; | 1927 | return; |
| 1929 | spin_lock(&qdev->hw_lock); | ||
| 1930 | if (ql_set_mac_addr_reg | 1928 | if (ql_set_mac_addr_reg |
| 1931 | (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { | 1929 | (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { |
| 1932 | QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n"); | 1930 | QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n"); |
| 1933 | } | 1931 | } |
| 1934 | spin_unlock(&qdev->hw_lock); | ||
| 1935 | ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); | 1932 | ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); |
| 1936 | } | 1933 | } |
| 1937 | 1934 | ||
| @@ -1945,12 +1942,10 @@ static void ql_vlan_rx_kill_vid(struct net_device *ndev, u16 vid) | |||
| 1945 | if (status) | 1942 | if (status) |
| 1946 | return; | 1943 | return; |
| 1947 | 1944 | ||
| 1948 | spin_lock(&qdev->hw_lock); | ||
| 1949 | if (ql_set_mac_addr_reg | 1945 | if (ql_set_mac_addr_reg |
| 1950 | (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { | 1946 | (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { |
| 1951 | QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n"); | 1947 | QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n"); |
| 1952 | } | 1948 | } |
| 1953 | spin_unlock(&qdev->hw_lock); | ||
| 1954 | ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); | 1949 | ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); |
| 1955 | 1950 | ||
| 1956 | } | 1951 | } |
| @@ -2001,15 +1996,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) | |||
| 2001 | /* | 1996 | /* |
| 2002 | * Check MPI processor activity. | 1997 | * Check MPI processor activity. |
| 2003 | */ | 1998 | */ |
| 2004 | if (var & STS_PI) { | 1999 | if ((var & STS_PI) && |
| 2000 | (ql_read32(qdev, INTR_MASK) & INTR_MASK_PI)) { | ||
| 2005 | /* | 2001 | /* |
| 2006 | * We've got an async event or mailbox completion. | 2002 | * We've got an async event or mailbox completion. |
| 2007 | * Handle it and clear the source of the interrupt. | 2003 | * Handle it and clear the source of the interrupt. |
| 2008 | */ | 2004 | */ |
| 2009 | QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n"); | 2005 | QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n"); |
| 2010 | ql_disable_completion_interrupt(qdev, intr_context->intr); | 2006 | ql_disable_completion_interrupt(qdev, intr_context->intr); |
| 2011 | queue_delayed_work_on(smp_processor_id(), qdev->workqueue, | 2007 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); |
| 2012 | &qdev->mpi_work, 0); | 2008 | queue_delayed_work_on(smp_processor_id(), |
| 2009 | qdev->workqueue, &qdev->mpi_work, 0); | ||
| 2013 | work_done++; | 2010 | work_done++; |
| 2014 | } | 2011 | } |
| 2015 | 2012 | ||
| @@ -3585,7 +3582,6 @@ static void qlge_set_multicast_list(struct net_device *ndev) | |||
| 3585 | status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK); | 3582 | status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK); |
| 3586 | if (status) | 3583 | if (status) |
| 3587 | return; | 3584 | return; |
| 3588 | spin_lock(&qdev->hw_lock); | ||
| 3589 | /* | 3585 | /* |
| 3590 | * Set or clear promiscuous mode if a | 3586 | * Set or clear promiscuous mode if a |
| 3591 | * transition is taking place. | 3587 | * transition is taking place. |
| @@ -3662,7 +3658,6 @@ static void qlge_set_multicast_list(struct net_device *ndev) | |||
| 3662 | } | 3658 | } |
| 3663 | } | 3659 | } |
| 3664 | exit: | 3660 | exit: |
| 3665 | spin_unlock(&qdev->hw_lock); | ||
| 3666 | ql_sem_unlock(qdev, SEM_RT_IDX_MASK); | 3661 | ql_sem_unlock(qdev, SEM_RT_IDX_MASK); |
| 3667 | } | 3662 | } |
| 3668 | 3663 | ||
| @@ -3682,10 +3677,8 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p) | |||
| 3682 | status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); | 3677 | status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); |
| 3683 | if (status) | 3678 | if (status) |
| 3684 | return status; | 3679 | return status; |
| 3685 | spin_lock(&qdev->hw_lock); | ||
| 3686 | status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr, | 3680 | status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr, |
| 3687 | MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ); | 3681 | MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ); |
| 3688 | spin_unlock(&qdev->hw_lock); | ||
| 3689 | if (status) | 3682 | if (status) |
| 3690 | QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n"); | 3683 | QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n"); |
| 3691 | ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); | 3684 | ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); |
| @@ -3928,7 +3921,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev, | |||
| 3928 | INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work); | 3921 | INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work); |
| 3929 | INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work); | 3922 | INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work); |
| 3930 | INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work); | 3923 | INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work); |
| 3931 | mutex_init(&qdev->mpi_mutex); | ||
| 3932 | init_completion(&qdev->ide_completion); | 3924 | init_completion(&qdev->ide_completion); |
| 3933 | 3925 | ||
| 3934 | if (!cards_found) { | 3926 | if (!cards_found) { |
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index 6685bd97da91..c2e43073047e 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
| @@ -472,7 +472,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
| 472 | { | 472 | { |
| 473 | int status, count; | 473 | int status, count; |
| 474 | 474 | ||
| 475 | mutex_lock(&qdev->mpi_mutex); | ||
| 476 | 475 | ||
| 477 | /* Begin polled mode for MPI */ | 476 | /* Begin polled mode for MPI */ |
| 478 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); | 477 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); |
| @@ -541,7 +540,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
| 541 | status = -EIO; | 540 | status = -EIO; |
| 542 | } | 541 | } |
| 543 | end: | 542 | end: |
| 544 | mutex_unlock(&qdev->mpi_mutex); | ||
| 545 | /* End polled mode for MPI */ | 543 | /* End polled mode for MPI */ |
| 546 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI); | 544 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI); |
| 547 | return status; | 545 | return status; |
| @@ -776,7 +774,9 @@ static int ql_idc_wait(struct ql_adapter *qdev) | |||
| 776 | static int ql_set_port_cfg(struct ql_adapter *qdev) | 774 | static int ql_set_port_cfg(struct ql_adapter *qdev) |
| 777 | { | 775 | { |
| 778 | int status; | 776 | int status; |
| 777 | rtnl_lock(); | ||
| 779 | status = ql_mb_set_port_cfg(qdev); | 778 | status = ql_mb_set_port_cfg(qdev); |
| 779 | rtnl_unlock(); | ||
| 780 | if (status) | 780 | if (status) |
| 781 | return status; | 781 | return status; |
| 782 | status = ql_idc_wait(qdev); | 782 | status = ql_idc_wait(qdev); |
| @@ -797,7 +797,9 @@ void ql_mpi_port_cfg_work(struct work_struct *work) | |||
| 797 | container_of(work, struct ql_adapter, mpi_port_cfg_work.work); | 797 | container_of(work, struct ql_adapter, mpi_port_cfg_work.work); |
| 798 | int status; | 798 | int status; |
| 799 | 799 | ||
| 800 | rtnl_lock(); | ||
| 800 | status = ql_mb_get_port_cfg(qdev); | 801 | status = ql_mb_get_port_cfg(qdev); |
| 802 | rtnl_unlock(); | ||
| 801 | if (status) { | 803 | if (status) { |
| 802 | QPRINTK(qdev, DRV, ERR, | 804 | QPRINTK(qdev, DRV, ERR, |
| 803 | "Bug: Failed to get port config data.\n"); | 805 | "Bug: Failed to get port config data.\n"); |
| @@ -855,7 +857,9 @@ void ql_mpi_idc_work(struct work_struct *work) | |||
| 855 | * needs to be set. | 857 | * needs to be set. |
| 856 | * */ | 858 | * */ |
| 857 | set_bit(QL_CAM_RT_SET, &qdev->flags); | 859 | set_bit(QL_CAM_RT_SET, &qdev->flags); |
| 860 | rtnl_lock(); | ||
| 858 | status = ql_mb_idc_ack(qdev); | 861 | status = ql_mb_idc_ack(qdev); |
| 862 | rtnl_unlock(); | ||
| 859 | if (status) { | 863 | if (status) { |
| 860 | QPRINTK(qdev, DRV, ERR, | 864 | QPRINTK(qdev, DRV, ERR, |
| 861 | "Bug: No pending IDC!\n"); | 865 | "Bug: No pending IDC!\n"); |
| @@ -871,7 +875,7 @@ void ql_mpi_work(struct work_struct *work) | |||
| 871 | struct mbox_params *mbcp = &mbc; | 875 | struct mbox_params *mbcp = &mbc; |
| 872 | int err = 0; | 876 | int err = 0; |
| 873 | 877 | ||
| 874 | mutex_lock(&qdev->mpi_mutex); | 878 | rtnl_lock(); |
| 875 | 879 | ||
| 876 | while (ql_read32(qdev, STS) & STS_PI) { | 880 | while (ql_read32(qdev, STS) & STS_PI) { |
| 877 | memset(mbcp, 0, sizeof(struct mbox_params)); | 881 | memset(mbcp, 0, sizeof(struct mbox_params)); |
| @@ -884,7 +888,7 @@ void ql_mpi_work(struct work_struct *work) | |||
| 884 | break; | 888 | break; |
| 885 | } | 889 | } |
| 886 | 890 | ||
| 887 | mutex_unlock(&qdev->mpi_mutex); | 891 | rtnl_unlock(); |
| 888 | ql_enable_completion_interrupt(qdev, 0); | 892 | ql_enable_completion_interrupt(qdev, 0); |
| 889 | } | 893 | } |
| 890 | 894 | ||
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index f09bc5dfe8b2..ba5d3fe753b6 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -902,11 +902,12 @@ static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg) | |||
| 902 | struct tg3 *tp = bp->priv; | 902 | struct tg3 *tp = bp->priv; |
| 903 | u32 val; | 903 | u32 val; |
| 904 | 904 | ||
| 905 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED) | 905 | spin_lock_bh(&tp->lock); |
| 906 | return -EAGAIN; | ||
| 907 | 906 | ||
| 908 | if (tg3_readphy(tp, reg, &val)) | 907 | if (tg3_readphy(tp, reg, &val)) |
| 909 | return -EIO; | 908 | val = -EIO; |
| 909 | |||
| 910 | spin_unlock_bh(&tp->lock); | ||
| 910 | 911 | ||
| 911 | return val; | 912 | return val; |
| 912 | } | 913 | } |
| @@ -914,14 +915,16 @@ static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg) | |||
| 914 | static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val) | 915 | static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val) |
| 915 | { | 916 | { |
| 916 | struct tg3 *tp = bp->priv; | 917 | struct tg3 *tp = bp->priv; |
| 918 | u32 ret = 0; | ||
| 917 | 919 | ||
| 918 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED) | 920 | spin_lock_bh(&tp->lock); |
| 919 | return -EAGAIN; | ||
| 920 | 921 | ||
| 921 | if (tg3_writephy(tp, reg, val)) | 922 | if (tg3_writephy(tp, reg, val)) |
| 922 | return -EIO; | 923 | ret = -EIO; |
| 923 | 924 | ||
| 924 | return 0; | 925 | spin_unlock_bh(&tp->lock); |
| 926 | |||
| 927 | return ret; | ||
| 925 | } | 928 | } |
| 926 | 929 | ||
| 927 | static int tg3_mdio_reset(struct mii_bus *bp) | 930 | static int tg3_mdio_reset(struct mii_bus *bp) |
| @@ -1011,12 +1014,6 @@ static void tg3_mdio_config_5785(struct tg3 *tp) | |||
| 1011 | 1014 | ||
| 1012 | static void tg3_mdio_start(struct tg3 *tp) | 1015 | static void tg3_mdio_start(struct tg3 *tp) |
| 1013 | { | 1016 | { |
| 1014 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { | ||
| 1015 | mutex_lock(&tp->mdio_bus->mdio_lock); | ||
| 1016 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; | ||
| 1017 | mutex_unlock(&tp->mdio_bus->mdio_lock); | ||
| 1018 | } | ||
| 1019 | |||
| 1020 | tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; | 1017 | tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; |
| 1021 | tw32_f(MAC_MI_MODE, tp->mi_mode); | 1018 | tw32_f(MAC_MI_MODE, tp->mi_mode); |
| 1022 | udelay(80); | 1019 | udelay(80); |
| @@ -1041,15 +1038,6 @@ static void tg3_mdio_start(struct tg3 *tp) | |||
| 1041 | tg3_mdio_config_5785(tp); | 1038 | tg3_mdio_config_5785(tp); |
| 1042 | } | 1039 | } |
| 1043 | 1040 | ||
| 1044 | static void tg3_mdio_stop(struct tg3 *tp) | ||
| 1045 | { | ||
| 1046 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { | ||
| 1047 | mutex_lock(&tp->mdio_bus->mdio_lock); | ||
| 1048 | tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_PAUSED; | ||
| 1049 | mutex_unlock(&tp->mdio_bus->mdio_lock); | ||
| 1050 | } | ||
| 1051 | } | ||
| 1052 | |||
| 1053 | static int tg3_mdio_init(struct tg3 *tp) | 1041 | static int tg3_mdio_init(struct tg3 *tp) |
| 1054 | { | 1042 | { |
| 1055 | int i; | 1043 | int i; |
| @@ -1141,7 +1129,6 @@ static void tg3_mdio_fini(struct tg3 *tp) | |||
| 1141 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED; | 1129 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED; |
| 1142 | mdiobus_unregister(tp->mdio_bus); | 1130 | mdiobus_unregister(tp->mdio_bus); |
| 1143 | mdiobus_free(tp->mdio_bus); | 1131 | mdiobus_free(tp->mdio_bus); |
| 1144 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; | ||
| 1145 | } | 1132 | } |
| 1146 | } | 1133 | } |
| 1147 | 1134 | ||
| @@ -1363,7 +1350,7 @@ static void tg3_adjust_link(struct net_device *dev) | |||
| 1363 | struct tg3 *tp = netdev_priv(dev); | 1350 | struct tg3 *tp = netdev_priv(dev); |
| 1364 | struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR]; | 1351 | struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR]; |
| 1365 | 1352 | ||
| 1366 | spin_lock(&tp->lock); | 1353 | spin_lock_bh(&tp->lock); |
| 1367 | 1354 | ||
| 1368 | mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK | | 1355 | mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK | |
| 1369 | MAC_MODE_HALF_DUPLEX); | 1356 | MAC_MODE_HALF_DUPLEX); |
| @@ -1431,7 +1418,7 @@ static void tg3_adjust_link(struct net_device *dev) | |||
| 1431 | tp->link_config.active_speed = phydev->speed; | 1418 | tp->link_config.active_speed = phydev->speed; |
| 1432 | tp->link_config.active_duplex = phydev->duplex; | 1419 | tp->link_config.active_duplex = phydev->duplex; |
| 1433 | 1420 | ||
| 1434 | spin_unlock(&tp->lock); | 1421 | spin_unlock_bh(&tp->lock); |
| 1435 | 1422 | ||
| 1436 | if (linkmesg) | 1423 | if (linkmesg) |
| 1437 | tg3_link_report(tp); | 1424 | tg3_link_report(tp); |
| @@ -6392,8 +6379,6 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
| 6392 | 6379 | ||
| 6393 | tg3_nvram_lock(tp); | 6380 | tg3_nvram_lock(tp); |
| 6394 | 6381 | ||
| 6395 | tg3_mdio_stop(tp); | ||
| 6396 | |||
| 6397 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); | 6382 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); |
| 6398 | 6383 | ||
| 6399 | /* No matching tg3_nvram_unlock() after this because | 6384 | /* No matching tg3_nvram_unlock() after this because |
| @@ -8698,6 +8683,8 @@ static int tg3_close(struct net_device *dev) | |||
| 8698 | 8683 | ||
| 8699 | del_timer_sync(&tp->timer); | 8684 | del_timer_sync(&tp->timer); |
| 8700 | 8685 | ||
| 8686 | tg3_phy_stop(tp); | ||
| 8687 | |||
| 8701 | tg3_full_lock(tp, 1); | 8688 | tg3_full_lock(tp, 1); |
| 8702 | #if 0 | 8689 | #if 0 |
| 8703 | tg3_dump_state(tp); | 8690 | tg3_dump_state(tp); |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 524691cd9896..bab7940158e6 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
| @@ -2748,7 +2748,6 @@ struct tg3 { | |||
| 2748 | #define TG3_FLG3_5701_DMA_BUG 0x00000008 | 2748 | #define TG3_FLG3_5701_DMA_BUG 0x00000008 |
| 2749 | #define TG3_FLG3_USE_PHYLIB 0x00000010 | 2749 | #define TG3_FLG3_USE_PHYLIB 0x00000010 |
| 2750 | #define TG3_FLG3_MDIOBUS_INITED 0x00000020 | 2750 | #define TG3_FLG3_MDIOBUS_INITED 0x00000020 |
| 2751 | #define TG3_FLG3_MDIOBUS_PAUSED 0x00000040 | ||
| 2752 | #define TG3_FLG3_PHY_CONNECTED 0x00000080 | 2751 | #define TG3_FLG3_PHY_CONNECTED 0x00000080 |
| 2753 | #define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100 | 2752 | #define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100 |
| 2754 | #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200 | 2753 | #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200 |
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index d032bba9bc4c..0caa8008c51c 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
| @@ -418,6 +418,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
| 418 | goto halt_fail_and_release; | 418 | goto halt_fail_and_release; |
| 419 | } | 419 | } |
| 420 | memcpy(net->dev_addr, bp, ETH_ALEN); | 420 | memcpy(net->dev_addr, bp, ETH_ALEN); |
| 421 | memcpy(net->perm_addr, bp, ETH_ALEN); | ||
| 421 | 422 | ||
| 422 | /* set a nonzero filter to enable data transfers */ | 423 | /* set a nonzero filter to enable data transfers */ |
| 423 | memset(u.set, 0, sizeof *u.set); | 424 | memset(u.set, 0, sizeof *u.set); |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index a3bb49031a7f..ff4617e21426 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
| @@ -873,10 +873,10 @@ static struct pcmcia_device_id serial_ids[] = { | |||
| 873 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 873 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
| 874 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 874 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
| 875 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 875 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
| 876 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"), | 876 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
| 877 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"), | 877 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
| 878 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), | 878 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), |
| 879 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "DP83903.cis"), | 879 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"), |
| 880 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), | 880 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), |
| 881 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), | 881 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), |
| 882 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ | 882 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ |
| @@ -884,9 +884,9 @@ static struct pcmcia_device_id serial_ids[] = { | |||
| 884 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ | 884 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ |
| 885 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ | 885 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ |
| 886 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), | 886 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), |
| 887 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "COMpad2.cis"), | 887 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"), |
| 888 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), | 888 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"), |
| 889 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), | 889 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"), |
| 890 | PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"), | 890 | PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"), |
| 891 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"), | 891 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"), |
| 892 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b), | 892 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b), |
diff --git a/drivers/usb/gadget/r8a66597-udc.h b/drivers/usb/gadget/r8a66597-udc.h index 03087e7b9190..9a537aa07968 100644 --- a/drivers/usb/gadget/r8a66597-udc.h +++ b/drivers/usb/gadget/r8a66597-udc.h | |||
| @@ -131,31 +131,48 @@ static inline u16 r8a66597_read(struct r8a66597 *r8a66597, unsigned long offset) | |||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static inline void r8a66597_read_fifo(struct r8a66597 *r8a66597, | 133 | static inline void r8a66597_read_fifo(struct r8a66597 *r8a66597, |
| 134 | unsigned long offset, u16 *buf, | 134 | unsigned long offset, |
| 135 | unsigned char *buf, | ||
| 135 | int len) | 136 | int len) |
| 136 | { | 137 | { |
| 138 | unsigned long fifoaddr = r8a66597->reg + offset; | ||
| 139 | unsigned int data; | ||
| 140 | int i; | ||
| 141 | |||
| 137 | if (r8a66597->pdata->on_chip) { | 142 | if (r8a66597->pdata->on_chip) { |
| 138 | unsigned long fifoaddr = r8a66597->reg + offset; | 143 | /* 32-bit accesses for on_chip controllers */ |
| 139 | unsigned long count; | 144 | |
| 140 | union { | 145 | /* aligned buf case */ |
| 141 | unsigned long dword; | 146 | if (len >= 4 && !((unsigned long)buf & 0x03)) { |
| 142 | unsigned char byte[4]; | 147 | insl(fifoaddr, buf, len / 4); |
| 143 | } data; | 148 | buf += len & ~0x03; |
| 144 | unsigned char *pb; | 149 | len &= 0x03; |
| 145 | int i; | 150 | } |
| 146 | 151 | ||
| 147 | count = len / 4; | 152 | /* unaligned buf case */ |
| 148 | insl(fifoaddr, buf, count); | 153 | for (i = 0; i < len; i++) { |
| 149 | 154 | if (!(i & 0x03)) | |
| 150 | if (len & 0x00000003) { | 155 | data = inl(fifoaddr); |
| 151 | data.dword = inl(fifoaddr); | 156 | |
| 152 | pb = (unsigned char *)buf + count * 4; | 157 | buf[i] = (data >> ((i & 0x03) * 8)) & 0xff; |
| 153 | for (i = 0; i < (len & 0x00000003); i++) | ||
| 154 | pb[i] = data.byte[i]; | ||
| 155 | } | 158 | } |
| 156 | } else { | 159 | } else { |
| 157 | len = (len + 1) / 2; | 160 | /* 16-bit accesses for external controllers */ |
| 158 | insw(r8a66597->reg + offset, buf, len); | 161 | |
| 162 | /* aligned buf case */ | ||
| 163 | if (len >= 2 && !((unsigned long)buf & 0x01)) { | ||
| 164 | insw(fifoaddr, buf, len / 2); | ||
| 165 | buf += len & ~0x01; | ||
| 166 | len &= 0x01; | ||
| 167 | } | ||
| 168 | |||
| 169 | /* unaligned buf case */ | ||
| 170 | for (i = 0; i < len; i++) { | ||
| 171 | if (!(i & 0x01)) | ||
| 172 | data = inw(fifoaddr); | ||
| 173 | |||
| 174 | buf[i] = (data >> ((i & 0x01) * 8)) & 0xff; | ||
| 175 | } | ||
| 159 | } | 176 | } |
| 160 | } | 177 | } |
| 161 | 178 | ||
| @@ -166,38 +183,40 @@ static inline void r8a66597_write(struct r8a66597 *r8a66597, u16 val, | |||
| 166 | } | 183 | } |
| 167 | 184 | ||
| 168 | static inline void r8a66597_write_fifo(struct r8a66597 *r8a66597, | 185 | static inline void r8a66597_write_fifo(struct r8a66597 *r8a66597, |
| 169 | unsigned long offset, u16 *buf, | 186 | unsigned long offset, |
| 187 | unsigned char *buf, | ||
| 170 | int len) | 188 | int len) |
| 171 | { | 189 | { |
| 172 | unsigned long fifoaddr = r8a66597->reg + offset; | 190 | unsigned long fifoaddr = r8a66597->reg + offset; |
| 191 | int adj = 0; | ||
| 192 | int i; | ||
| 173 | 193 | ||
| 174 | if (r8a66597->pdata->on_chip) { | 194 | if (r8a66597->pdata->on_chip) { |
| 175 | unsigned long count; | 195 | /* 32-bit access only if buf is 32-bit aligned */ |
| 176 | unsigned char *pb; | 196 | if (len >= 4 && !((unsigned long)buf & 0x03)) { |
| 177 | int i; | 197 | outsl(fifoaddr, buf, len / 4); |
| 178 | 198 | buf += len & ~0x03; | |
| 179 | count = len / 4; | 199 | len &= 0x03; |
| 180 | outsl(fifoaddr, buf, count); | ||
| 181 | |||
| 182 | if (len & 0x00000003) { | ||
| 183 | pb = (unsigned char *)buf + count * 4; | ||
| 184 | for (i = 0; i < (len & 0x00000003); i++) { | ||
| 185 | if (r8a66597_read(r8a66597, CFIFOSEL) & BIGEND) | ||
| 186 | outb(pb[i], fifoaddr + i); | ||
| 187 | else | ||
| 188 | outb(pb[i], fifoaddr + 3 - i); | ||
| 189 | } | ||
| 190 | } | 200 | } |
| 191 | } else { | 201 | } else { |
| 192 | int odd = len & 0x0001; | 202 | /* 16-bit access only if buf is 16-bit aligned */ |
| 193 | 203 | if (len >= 2 && !((unsigned long)buf & 0x01)) { | |
| 194 | len = len / 2; | 204 | outsw(fifoaddr, buf, len / 2); |
| 195 | outsw(fifoaddr, buf, len); | 205 | buf += len & ~0x01; |
| 196 | if (unlikely(odd)) { | 206 | len &= 0x01; |
| 197 | buf = &buf[len]; | ||
| 198 | outb((unsigned char)*buf, fifoaddr); | ||
| 199 | } | 207 | } |
| 200 | } | 208 | } |
| 209 | |||
| 210 | /* adjust fifo address in the little endian case */ | ||
| 211 | if (!(r8a66597_read(r8a66597, CFIFOSEL) & BIGEND)) { | ||
| 212 | if (r8a66597->pdata->on_chip) | ||
| 213 | adj = 0x03; /* 32-bit wide */ | ||
| 214 | else | ||
| 215 | adj = 0x01; /* 16-bit wide */ | ||
| 216 | } | ||
| 217 | |||
| 218 | for (i = 0; i < len; i++) | ||
| 219 | outb(buf[i], fifoaddr + adj - (i & adj)); | ||
| 201 | } | 220 | } |
| 202 | 221 | ||
| 203 | static inline void r8a66597_mdfy(struct r8a66597 *r8a66597, | 222 | static inline void r8a66597_mdfy(struct r8a66597 *r8a66597, |
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c index 42e1005e2916..d065894ce38f 100644 --- a/drivers/video/da8xx-fb.c +++ b/drivers/video/da8xx-fb.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | #include <linux/device.h> | 26 | #include <linux/device.h> |
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/uaccess.h> | 28 | #include <linux/uaccess.h> |
| 29 | #include <linux/device.h> | ||
| 30 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
| 31 | #include <linux/clk.h> | 30 | #include <linux/clk.h> |
| 32 | #include <video/da8xx-fb.h> | 31 | #include <video/da8xx-fb.h> |
diff --git a/drivers/video/msm/mddi.c b/drivers/video/msm/mddi.c index f2de5a1acd6d..5c5a1ad1d397 100644 --- a/drivers/video/msm/mddi.c +++ b/drivers/video/msm/mddi.c | |||
| @@ -27,8 +27,6 @@ | |||
| 27 | #include <mach/msm_iomap.h> | 27 | #include <mach/msm_iomap.h> |
| 28 | #include <mach/irqs.h> | 28 | #include <mach/irqs.h> |
| 29 | #include <mach/board.h> | 29 | #include <mach/board.h> |
| 30 | #include <linux/delay.h> | ||
| 31 | |||
| 32 | #include <mach/msm_fb.h> | 30 | #include <mach/msm_fb.h> |
| 33 | #include "mddi_hw.h" | 31 | #include "mddi_hw.h" |
| 34 | 32 | ||
diff --git a/drivers/video/omap/blizzard.c b/drivers/video/omap/blizzard.c index d5e59556f9e2..70dadf9d2334 100644 --- a/drivers/video/omap/blizzard.c +++ b/drivers/video/omap/blizzard.c | |||
| @@ -93,7 +93,7 @@ struct blizzard_reg_list { | |||
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | /* These need to be saved / restored separately from the rest. */ | 95 | /* These need to be saved / restored separately from the rest. */ |
| 96 | static struct blizzard_reg_list blizzard_pll_regs[] = { | 96 | static const struct blizzard_reg_list blizzard_pll_regs[] = { |
| 97 | { | 97 | { |
| 98 | .start = 0x04, /* Don't save PLL ctrl (0x0C) */ | 98 | .start = 0x04, /* Don't save PLL ctrl (0x0C) */ |
| 99 | .end = 0x0a, | 99 | .end = 0x0a, |
| @@ -104,7 +104,7 @@ static struct blizzard_reg_list blizzard_pll_regs[] = { | |||
| 104 | }, | 104 | }, |
| 105 | }; | 105 | }; |
| 106 | 106 | ||
| 107 | static struct blizzard_reg_list blizzard_gen_regs[] = { | 107 | static const struct blizzard_reg_list blizzard_gen_regs[] = { |
| 108 | { | 108 | { |
| 109 | .start = 0x18, /* SDRAM control */ | 109 | .start = 0x18, /* SDRAM control */ |
| 110 | .end = 0x20, | 110 | .end = 0x20, |
| @@ -191,7 +191,7 @@ struct blizzard_struct { | |||
| 191 | 191 | ||
| 192 | struct omapfb_device *fbdev; | 192 | struct omapfb_device *fbdev; |
| 193 | struct lcd_ctrl_extif *extif; | 193 | struct lcd_ctrl_extif *extif; |
| 194 | struct lcd_ctrl *int_ctrl; | 194 | const struct lcd_ctrl *int_ctrl; |
| 195 | 195 | ||
| 196 | void (*power_up)(struct device *dev); | 196 | void (*power_up)(struct device *dev); |
| 197 | void (*power_down)(struct device *dev); | 197 | void (*power_down)(struct device *dev); |
| @@ -1372,7 +1372,7 @@ static void blizzard_get_caps(int plane, struct omapfb_caps *caps) | |||
| 1372 | (1 << OMAPFB_COLOR_YUV420); | 1372 | (1 << OMAPFB_COLOR_YUV420); |
| 1373 | } | 1373 | } |
| 1374 | 1374 | ||
| 1375 | static void _save_regs(struct blizzard_reg_list *list, int cnt) | 1375 | static void _save_regs(const struct blizzard_reg_list *list, int cnt) |
| 1376 | { | 1376 | { |
| 1377 | int i; | 1377 | int i; |
| 1378 | 1378 | ||
| @@ -1383,7 +1383,7 @@ static void _save_regs(struct blizzard_reg_list *list, int cnt) | |||
| 1383 | } | 1383 | } |
| 1384 | } | 1384 | } |
| 1385 | 1385 | ||
| 1386 | static void _restore_regs(struct blizzard_reg_list *list, int cnt) | 1386 | static void _restore_regs(const struct blizzard_reg_list *list, int cnt) |
| 1387 | { | 1387 | { |
| 1388 | int i; | 1388 | int i; |
| 1389 | 1389 | ||
diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c index 125e605b8c68..0d0c8c8b9b56 100644 --- a/drivers/video/omap/omapfb_main.c +++ b/drivers/video/omap/omapfb_main.c | |||
| @@ -393,7 +393,7 @@ static void omapfb_sync(struct fb_info *fbi) | |||
| 393 | * Set fb_info.fix fields and also updates fbdev. | 393 | * Set fb_info.fix fields and also updates fbdev. |
| 394 | * When calling this fb_info.var must be set up already. | 394 | * When calling this fb_info.var must be set up already. |
| 395 | */ | 395 | */ |
| 396 | static void set_fb_fix(struct fb_info *fbi) | 396 | static void set_fb_fix(struct fb_info *fbi, int from_init) |
| 397 | { | 397 | { |
| 398 | struct fb_fix_screeninfo *fix = &fbi->fix; | 398 | struct fb_fix_screeninfo *fix = &fbi->fix; |
| 399 | struct fb_var_screeninfo *var = &fbi->var; | 399 | struct fb_var_screeninfo *var = &fbi->var; |
| @@ -403,10 +403,16 @@ static void set_fb_fix(struct fb_info *fbi) | |||
| 403 | 403 | ||
| 404 | rg = &plane->fbdev->mem_desc.region[plane->idx]; | 404 | rg = &plane->fbdev->mem_desc.region[plane->idx]; |
| 405 | fbi->screen_base = rg->vaddr; | 405 | fbi->screen_base = rg->vaddr; |
| 406 | mutex_lock(&fbi->mm_lock); | 406 | |
| 407 | fix->smem_start = rg->paddr; | 407 | if (!from_init) { |
| 408 | fix->smem_len = rg->size; | 408 | mutex_lock(&fbi->mm_lock); |
| 409 | mutex_unlock(&fbi->mm_lock); | 409 | fix->smem_start = rg->paddr; |
| 410 | fix->smem_len = rg->size; | ||
| 411 | mutex_unlock(&fbi->mm_lock); | ||
| 412 | } else { | ||
| 413 | fix->smem_start = rg->paddr; | ||
| 414 | fix->smem_len = rg->size; | ||
| 415 | } | ||
| 410 | 416 | ||
| 411 | fix->type = FB_TYPE_PACKED_PIXELS; | 417 | fix->type = FB_TYPE_PACKED_PIXELS; |
| 412 | bpp = var->bits_per_pixel; | 418 | bpp = var->bits_per_pixel; |
| @@ -704,7 +710,7 @@ static int omapfb_set_par(struct fb_info *fbi) | |||
| 704 | int r = 0; | 710 | int r = 0; |
| 705 | 711 | ||
| 706 | omapfb_rqueue_lock(fbdev); | 712 | omapfb_rqueue_lock(fbdev); |
| 707 | set_fb_fix(fbi); | 713 | set_fb_fix(fbi, 0); |
| 708 | r = ctrl_change_mode(fbi); | 714 | r = ctrl_change_mode(fbi); |
| 709 | omapfb_rqueue_unlock(fbdev); | 715 | omapfb_rqueue_unlock(fbdev); |
| 710 | 716 | ||
| @@ -904,7 +910,7 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) | |||
| 904 | if (old_size != size) { | 910 | if (old_size != size) { |
| 905 | if (size) { | 911 | if (size) { |
| 906 | memcpy(&fbi->var, new_var, sizeof(fbi->var)); | 912 | memcpy(&fbi->var, new_var, sizeof(fbi->var)); |
| 907 | set_fb_fix(fbi); | 913 | set_fb_fix(fbi, 0); |
| 908 | } else { | 914 | } else { |
| 909 | /* | 915 | /* |
| 910 | * Set these explicitly to indicate that the | 916 | * Set these explicitly to indicate that the |
| @@ -1504,7 +1510,7 @@ static int fbinfo_init(struct omapfb_device *fbdev, struct fb_info *info) | |||
| 1504 | var->bits_per_pixel = fbdev->panel->bpp; | 1510 | var->bits_per_pixel = fbdev->panel->bpp; |
| 1505 | 1511 | ||
| 1506 | set_fb_var(info, var); | 1512 | set_fb_var(info, var); |
| 1507 | set_fb_fix(info); | 1513 | set_fb_fix(info, 1); |
| 1508 | 1514 | ||
| 1509 | r = fb_alloc_cmap(&info->cmap, 16, 0); | 1515 | r = fb_alloc_cmap(&info->cmap, 16, 0); |
| 1510 | if (r != 0) | 1516 | if (r != 0) |
diff --git a/firmware/Makefile b/firmware/Makefile index 5ea80b19785b..a6c7c3e47e42 100644 --- a/firmware/Makefile +++ b/firmware/Makefile | |||
| @@ -67,10 +67,13 @@ fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin | |||
| 67 | fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ | 67 | fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ |
| 68 | e100/d102e_ucode.bin | 68 | e100/d102e_ucode.bin |
| 69 | fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin | 69 | fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin |
| 70 | fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis | 70 | fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \ |
| 71 | cis/DP83903.cis cis/NE2K.cis \ | ||
| 72 | cis/tamarack.cis | ||
| 71 | fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis | 73 | fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis |
| 72 | fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis | 74 | fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis |
| 73 | fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis | 75 | fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \ |
| 76 | cis/COMpad2.cis cis/COMpad4.cis | ||
| 74 | fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin | 77 | fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin |
| 75 | fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \ | 78 | fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \ |
| 76 | advansys/3550.bin advansys/38C0800.bin | 79 | advansys/3550.bin advansys/38C0800.bin |
diff --git a/firmware/WHENCE b/firmware/WHENCE index 3f8c4f6bc43f..c437e14f0b11 100644 --- a/firmware/WHENCE +++ b/firmware/WHENCE | |||
| @@ -597,6 +597,9 @@ Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter | |||
| 597 | 597 | ||
| 598 | File: cis/LA-PCM.cis | 598 | File: cis/LA-PCM.cis |
| 599 | cis/PCMLM28.cis | 599 | cis/PCMLM28.cis |
| 600 | cis/DP83903.cis | ||
| 601 | cis/NE2K.cis | ||
| 602 | cis/tamarack.cis | ||
| 600 | 603 | ||
| 601 | Licence: GPL | 604 | Licence: GPL |
| 602 | 605 | ||
| @@ -628,6 +631,8 @@ Driver: SERIAL_8250_CS - Serial PCMCIA adapter | |||
| 628 | 631 | ||
| 629 | File: cis/MT5634ZLX.cis | 632 | File: cis/MT5634ZLX.cis |
| 630 | cis/RS-COM-2P.cis | 633 | cis/RS-COM-2P.cis |
| 634 | cis/COMpad2.cis | ||
| 635 | cis/COMpad4.cis | ||
| 631 | 636 | ||
| 632 | Licence: GPL | 637 | Licence: GPL |
| 633 | 638 | ||
diff --git a/firmware/cis/COMpad2.cis.ihex b/firmware/cis/COMpad2.cis.ihex new file mode 100644 index 000000000000..1671c5e48caa --- /dev/null +++ b/firmware/cis/COMpad2.cis.ihex | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | :1000000001030000FF151F0401414456414E5445B1 | ||
| 2 | :10001000434800434F4D7061642D33322F38350013 | ||
| 3 | :10002000312E300000FF210202011A0501050001F6 | ||
| 4 | :10003000031B0EC18118AA61E80207E8030730B864 | ||
| 5 | :100040009E1B08820108AA6030030F1B0883010869 | ||
| 6 | :10005000AA6040030F1B08840108AA6050030F1B0D | ||
| 7 | :0D00600008850108AA6060030F1400FF006E | ||
| 8 | :00000001FF | ||
| 9 | # | ||
| 10 | # Replacement CIS for Advantech COMpad-32/85 | ||
| 11 | # | ||
diff --git a/firmware/cis/COMpad4.cis.ihex b/firmware/cis/COMpad4.cis.ihex new file mode 100644 index 000000000000..27bbec1921b3 --- /dev/null +++ b/firmware/cis/COMpad4.cis.ihex | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | :1000000001030000FF151F0401414456414E5445B1 | ||
| 2 | :10001000434800434F4D7061642D33322F383542D1 | ||
| 3 | :100020002D34000000FF210202011A050102000127 | ||
| 4 | :10003000011B0BC18118AA6040021F30B89E1B082B | ||
| 5 | :0C004000820108AA6040031F1400FF00AA | ||
| 6 | :00000001FF | ||
| 7 | # | ||
| 8 | # Replacement CIS for Advantech COMpad-32/85B-4 | ||
| 9 | # | ||
diff --git a/firmware/cis/DP83903.cis.ihex b/firmware/cis/DP83903.cis.ihex new file mode 100644 index 000000000000..6d73ea3cf1b8 --- /dev/null +++ b/firmware/cis/DP83903.cis.ihex | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | :1000000001030000FF152904014D756C74696675C4 | ||
| 2 | :100010006E6374696F6E20436172640000004E531A | ||
| 3 | :1000200043204D46204C414E2F4D6F64656D00FFBF | ||
| 4 | :1000300020047501000021020000060B02004900A7 | ||
| 5 | :100040000000006A000000FF00130343495321022F | ||
| 6 | :1000500006001A060517201077021B0C970179017C | ||
| 7 | :10006000556530FFFF284000FF001303434953212B | ||
| 8 | :100070000202001A060507401077021B09870119C2 | ||
| 9 | :0800800001552330FFFFFF00D2 | ||
| 10 | :00000001FF | ||
| 11 | # | ||
| 12 | # This CIS is for cards based on the National Semiconductor | ||
| 13 | # DP83903 Multiple Function Interface Chip | ||
| 14 | # | ||
diff --git a/firmware/cis/NE2K.cis.ihex b/firmware/cis/NE2K.cis.ihex new file mode 100644 index 000000000000..1bb40fc4759f --- /dev/null +++ b/firmware/cis/NE2K.cis.ihex | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | :1000000001030000FF1515040150434D4349410011 | ||
| 2 | :1000100045746865726E6574000000FF2102060079 | ||
| 3 | :100020001A050120F803031B09E001190155653089 | ||
| 4 | :06003000FFFF1400FF00B9 | ||
| 5 | :00000001FF | ||
| 6 | # | ||
| 7 | # Replacement CIS for various busted NE2000-compatible cards | ||
| 8 | # | ||
diff --git a/firmware/cis/tamarack.cis.ihex b/firmware/cis/tamarack.cis.ihex new file mode 100644 index 000000000000..1e86547fb361 --- /dev/null +++ b/firmware/cis/tamarack.cis.ihex | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | :100000000103D400FF17034100FF152404015441EC | ||
| 2 | :100010004D415241434B0045746865726E657400F2 | ||
| 3 | :10002000410030303437343331313830303100FF33 | ||
| 4 | :10003000210206001A050120F803031B14E08119B0 | ||
| 5 | :100040003F554D5D06864626E551000F100F30FFE7 | ||
| 6 | :05005000FF1400FF0099 | ||
| 7 | :00000001FF | ||
| 8 | # | ||
| 9 | # Replacement CIS for Surecom, Tamarack NE2000 cards | ||
| 10 | # | ||
diff --git a/fs/ecryptfs/Kconfig b/fs/ecryptfs/Kconfig index 8aadb99b7634..1cd6d9d3e29a 100644 --- a/fs/ecryptfs/Kconfig +++ b/fs/ecryptfs/Kconfig | |||
| @@ -1,8 +1,9 @@ | |||
| 1 | config ECRYPT_FS | 1 | config ECRYPT_FS |
| 2 | tristate "eCrypt filesystem layer support (EXPERIMENTAL)" | 2 | tristate "eCrypt filesystem layer support (EXPERIMENTAL)" |
| 3 | depends on EXPERIMENTAL && KEYS && NET | 3 | depends on EXPERIMENTAL && KEYS && CRYPTO |
| 4 | select CRYPTO_ECB | 4 | select CRYPTO_ECB |
| 5 | select CRYPTO_CBC | 5 | select CRYPTO_CBC |
| 6 | select CRYPTO_MD5 | ||
| 6 | help | 7 | help |
| 7 | Encrypted filesystem that operates on the VFS layer. See | 8 | Encrypted filesystem that operates on the VFS layer. See |
| 8 | <file:Documentation/filesystems/ecryptfs.txt> to learn more about | 9 | <file:Documentation/filesystems/ecryptfs.txt> to learn more about |
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 101fe4c7b1ee..c6ac85d6c701 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/key.h> | 35 | #include <linux/key.h> |
| 36 | #include <linux/parser.h> | 36 | #include <linux/parser.h> |
| 37 | #include <linux/fs_stack.h> | 37 | #include <linux/fs_stack.h> |
| 38 | #include <linux/ima.h> | ||
| 38 | #include "ecryptfs_kernel.h" | 39 | #include "ecryptfs_kernel.h" |
| 39 | 40 | ||
| 40 | /** | 41 | /** |
| @@ -118,6 +119,7 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry) | |||
| 118 | const struct cred *cred = current_cred(); | 119 | const struct cred *cred = current_cred(); |
| 119 | struct ecryptfs_inode_info *inode_info = | 120 | struct ecryptfs_inode_info *inode_info = |
| 120 | ecryptfs_inode_to_private(ecryptfs_dentry->d_inode); | 121 | ecryptfs_inode_to_private(ecryptfs_dentry->d_inode); |
| 122 | int opened_lower_file = 0; | ||
| 121 | int rc = 0; | 123 | int rc = 0; |
| 122 | 124 | ||
| 123 | mutex_lock(&inode_info->lower_file_mutex); | 125 | mutex_lock(&inode_info->lower_file_mutex); |
| @@ -134,9 +136,12 @@ int ecryptfs_init_persistent_file(struct dentry *ecryptfs_dentry) | |||
| 134 | "for lower_dentry [0x%p] and lower_mnt [0x%p]; " | 136 | "for lower_dentry [0x%p] and lower_mnt [0x%p]; " |
| 135 | "rc = [%d]\n", lower_dentry, lower_mnt, rc); | 137 | "rc = [%d]\n", lower_dentry, lower_mnt, rc); |
| 136 | inode_info->lower_file = NULL; | 138 | inode_info->lower_file = NULL; |
| 137 | } | 139 | } else |
| 140 | opened_lower_file = 1; | ||
| 138 | } | 141 | } |
| 139 | mutex_unlock(&inode_info->lower_file_mutex); | 142 | mutex_unlock(&inode_info->lower_file_mutex); |
| 143 | if (opened_lower_file) | ||
| 144 | ima_counts_get(inode_info->lower_file); | ||
| 140 | return rc; | 145 | return rc; |
| 141 | } | 146 | } |
| 142 | 147 | ||
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 63976c0ccc25..99ea196f071f 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
| @@ -1180,7 +1180,7 @@ static int nfs4_init_client(struct nfs_client *clp, | |||
| 1180 | 1, flags & NFS_MOUNT_NORESVPORT); | 1180 | 1, flags & NFS_MOUNT_NORESVPORT); |
| 1181 | if (error < 0) | 1181 | if (error < 0) |
| 1182 | goto error; | 1182 | goto error; |
| 1183 | memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); | 1183 | strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); |
| 1184 | 1184 | ||
| 1185 | error = nfs_idmap_new(clp); | 1185 | error = nfs_idmap_new(clp); |
| 1186 | if (error < 0) { | 1186 | if (error < 0) { |
diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c index 2636c26d56fa..fa3408f20112 100644 --- a/fs/nfs/nfs4namespace.c +++ b/fs/nfs/nfs4namespace.c | |||
| @@ -121,7 +121,7 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata, | |||
| 121 | 121 | ||
| 122 | mnt_path = nfs4_pathname_string(&location->rootpath, page2, PAGE_SIZE); | 122 | mnt_path = nfs4_pathname_string(&location->rootpath, page2, PAGE_SIZE); |
| 123 | if (IS_ERR(mnt_path)) | 123 | if (IS_ERR(mnt_path)) |
| 124 | return mnt; | 124 | return ERR_CAST(mnt_path); |
| 125 | mountdata->mnt_path = mnt_path; | 125 | mountdata->mnt_path = mnt_path; |
| 126 | maxbuflen = mnt_path - 1 - page2; | 126 | maxbuflen = mnt_path - 1 - page2; |
| 127 | 127 | ||
| @@ -132,15 +132,15 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata, | |||
| 132 | if (buf->len <= 0 || buf->len >= maxbuflen) | 132 | if (buf->len <= 0 || buf->len >= maxbuflen) |
| 133 | continue; | 133 | continue; |
| 134 | 134 | ||
| 135 | mountdata->addr = (struct sockaddr *)&addr; | ||
| 136 | |||
| 137 | if (memchr(buf->data, IPV6_SCOPE_DELIMITER, buf->len)) | 135 | if (memchr(buf->data, IPV6_SCOPE_DELIMITER, buf->len)) |
| 138 | continue; | 136 | continue; |
| 139 | mountdata->addrlen = nfs_parse_server_name(buf->data, | 137 | |
| 140 | buf->len, | 138 | mountdata->addrlen = nfs_parse_server_name(buf->data, buf->len, |
| 141 | mountdata->addr, mountdata->addrlen); | 139 | (struct sockaddr *)&addr, sizeof(addr)); |
| 142 | if (mountdata->addrlen == 0) | 140 | if (mountdata->addrlen == 0) |
| 143 | continue; | 141 | continue; |
| 142 | |||
| 143 | mountdata->addr = (struct sockaddr *)&addr; | ||
| 144 | rpc_set_port(mountdata->addr, NFS_PORT); | 144 | rpc_set_port(mountdata->addr, NFS_PORT); |
| 145 | 145 | ||
| 146 | memcpy(page2, buf->data, buf->len); | 146 | memcpy(page2, buf->data, buf->len); |
diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index e27c6cef18f2..0156c01c212c 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c | |||
| @@ -127,12 +127,6 @@ nfs4_schedule_state_renewal(struct nfs_client *clp) | |||
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | void | 129 | void |
| 130 | nfs4_renewd_prepare_shutdown(struct nfs_server *server) | ||
| 131 | { | ||
| 132 | cancel_delayed_work(&server->nfs_client->cl_renewd); | ||
| 133 | } | ||
| 134 | |||
| 135 | void | ||
| 136 | nfs4_kill_renewd(struct nfs_client *clp) | 130 | nfs4_kill_renewd(struct nfs_client *clp) |
| 137 | { | 131 | { |
| 138 | cancel_delayed_work_sync(&clp->cl_renewd); | 132 | cancel_delayed_work_sync(&clp->cl_renewd); |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 29786d3b9326..6dabf6feec94 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -728,22 +728,24 @@ static void nfs_umount_begin(struct super_block *sb) | |||
| 728 | unlock_kernel(); | 728 | unlock_kernel(); |
| 729 | } | 729 | } |
| 730 | 730 | ||
| 731 | static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(int flags) | 731 | static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(unsigned int version) |
| 732 | { | 732 | { |
| 733 | struct nfs_parsed_mount_data *data; | 733 | struct nfs_parsed_mount_data *data; |
| 734 | 734 | ||
| 735 | data = kzalloc(sizeof(*data), GFP_KERNEL); | 735 | data = kzalloc(sizeof(*data), GFP_KERNEL); |
| 736 | if (data) { | 736 | if (data) { |
| 737 | data->flags = flags; | ||
| 738 | data->rsize = NFS_MAX_FILE_IO_SIZE; | 737 | data->rsize = NFS_MAX_FILE_IO_SIZE; |
| 739 | data->wsize = NFS_MAX_FILE_IO_SIZE; | 738 | data->wsize = NFS_MAX_FILE_IO_SIZE; |
| 740 | data->acregmin = NFS_DEF_ACREGMIN; | 739 | data->acregmin = NFS_DEF_ACREGMIN; |
| 741 | data->acregmax = NFS_DEF_ACREGMAX; | 740 | data->acregmax = NFS_DEF_ACREGMAX; |
| 742 | data->acdirmin = NFS_DEF_ACDIRMIN; | 741 | data->acdirmin = NFS_DEF_ACDIRMIN; |
| 743 | data->acdirmax = NFS_DEF_ACDIRMAX; | 742 | data->acdirmax = NFS_DEF_ACDIRMAX; |
| 743 | data->mount_server.port = NFS_UNSPEC_PORT; | ||
| 744 | data->nfs_server.port = NFS_UNSPEC_PORT; | 744 | data->nfs_server.port = NFS_UNSPEC_PORT; |
| 745 | data->nfs_server.protocol = XPRT_TRANSPORT_TCP; | ||
| 745 | data->auth_flavors[0] = RPC_AUTH_UNIX; | 746 | data->auth_flavors[0] = RPC_AUTH_UNIX; |
| 746 | data->auth_flavor_len = 1; | 747 | data->auth_flavor_len = 1; |
| 748 | data->version = version; | ||
| 747 | data->minorversion = 0; | 749 | data->minorversion = 0; |
| 748 | } | 750 | } |
| 749 | return data; | 751 | return data; |
| @@ -776,15 +778,13 @@ static int nfs_verify_server_address(struct sockaddr *addr) | |||
| 776 | * Select between a default port value and a user-specified port value. | 778 | * Select between a default port value and a user-specified port value. |
| 777 | * If a zero value is set, then autobind will be used. | 779 | * If a zero value is set, then autobind will be used. |
| 778 | */ | 780 | */ |
| 779 | static void nfs_set_default_port(struct sockaddr *sap, const int parsed_port, | 781 | static void nfs_set_port(struct sockaddr *sap, int *port, |
| 780 | const unsigned short default_port) | 782 | const unsigned short default_port) |
| 781 | { | 783 | { |
| 782 | unsigned short port = default_port; | 784 | if (*port == NFS_UNSPEC_PORT) |
| 785 | *port = default_port; | ||
| 783 | 786 | ||
| 784 | if (parsed_port != NFS_UNSPEC_PORT) | 787 | rpc_set_port(sap, *port); |
| 785 | port = parsed_port; | ||
| 786 | |||
| 787 | rpc_set_port(sap, port); | ||
| 788 | } | 788 | } |
| 789 | 789 | ||
| 790 | /* | 790 | /* |
| @@ -1475,7 +1475,7 @@ static int nfs_try_mount(struct nfs_parsed_mount_data *args, | |||
| 1475 | args->mount_server.addrlen = args->nfs_server.addrlen; | 1475 | args->mount_server.addrlen = args->nfs_server.addrlen; |
| 1476 | } | 1476 | } |
| 1477 | request.salen = args->mount_server.addrlen; | 1477 | request.salen = args->mount_server.addrlen; |
| 1478 | nfs_set_default_port(request.sap, args->mount_server.port, 0); | 1478 | nfs_set_port(request.sap, &args->mount_server.port, 0); |
| 1479 | 1479 | ||
| 1480 | /* | 1480 | /* |
| 1481 | * Now ask the mount server to map our export path | 1481 | * Now ask the mount server to map our export path |
| @@ -1711,8 +1711,6 @@ static int nfs_validate_mount_data(void *options, | |||
| 1711 | 1711 | ||
| 1712 | if (!(data->flags & NFS_MOUNT_TCP)) | 1712 | if (!(data->flags & NFS_MOUNT_TCP)) |
| 1713 | args->nfs_server.protocol = XPRT_TRANSPORT_UDP; | 1713 | args->nfs_server.protocol = XPRT_TRANSPORT_UDP; |
| 1714 | else | ||
| 1715 | args->nfs_server.protocol = XPRT_TRANSPORT_TCP; | ||
| 1716 | /* N.B. caller will free nfs_server.hostname in all cases */ | 1714 | /* N.B. caller will free nfs_server.hostname in all cases */ |
| 1717 | args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL); | 1715 | args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL); |
| 1718 | args->namlen = data->namlen; | 1716 | args->namlen = data->namlen; |
| @@ -1767,7 +1765,7 @@ static int nfs_validate_mount_data(void *options, | |||
| 1767 | goto out_v4_not_compiled; | 1765 | goto out_v4_not_compiled; |
| 1768 | #endif | 1766 | #endif |
| 1769 | 1767 | ||
| 1770 | nfs_set_default_port(sap, args->nfs_server.port, 0); | 1768 | nfs_set_port(sap, &args->nfs_server.port, 0); |
| 1771 | 1769 | ||
| 1772 | nfs_set_mount_transport_protocol(args); | 1770 | nfs_set_mount_transport_protocol(args); |
| 1773 | 1771 | ||
| @@ -1848,9 +1846,10 @@ nfs_compare_remount_data(struct nfs_server *nfss, | |||
| 1848 | data->acdirmin != nfss->acdirmin / HZ || | 1846 | data->acdirmin != nfss->acdirmin / HZ || |
| 1849 | data->acdirmax != nfss->acdirmax / HZ || | 1847 | data->acdirmax != nfss->acdirmax / HZ || |
| 1850 | data->timeo != (10U * nfss->client->cl_timeout->to_initval / HZ) || | 1848 | data->timeo != (10U * nfss->client->cl_timeout->to_initval / HZ) || |
| 1849 | data->nfs_server.port != nfss->port || | ||
| 1851 | data->nfs_server.addrlen != nfss->nfs_client->cl_addrlen || | 1850 | data->nfs_server.addrlen != nfss->nfs_client->cl_addrlen || |
| 1852 | memcmp(&data->nfs_server.address, &nfss->nfs_client->cl_addr, | 1851 | !rpc_cmp_addr(&data->nfs_server.address, |
| 1853 | data->nfs_server.addrlen) != 0) | 1852 | &nfss->nfs_client->cl_addr)) |
| 1854 | return -EINVAL; | 1853 | return -EINVAL; |
| 1855 | 1854 | ||
| 1856 | return 0; | 1855 | return 0; |
| @@ -1893,6 +1892,7 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) | |||
| 1893 | data->acdirmin = nfss->acdirmin / HZ; | 1892 | data->acdirmin = nfss->acdirmin / HZ; |
| 1894 | data->acdirmax = nfss->acdirmax / HZ; | 1893 | data->acdirmax = nfss->acdirmax / HZ; |
| 1895 | data->timeo = 10U * nfss->client->cl_timeout->to_initval / HZ; | 1894 | data->timeo = 10U * nfss->client->cl_timeout->to_initval / HZ; |
| 1895 | data->nfs_server.port = nfss->port; | ||
| 1896 | data->nfs_server.addrlen = nfss->nfs_client->cl_addrlen; | 1896 | data->nfs_server.addrlen = nfss->nfs_client->cl_addrlen; |
| 1897 | memcpy(&data->nfs_server.address, &nfss->nfs_client->cl_addr, | 1897 | memcpy(&data->nfs_server.address, &nfss->nfs_client->cl_addr, |
| 1898 | data->nfs_server.addrlen); | 1898 | data->nfs_server.addrlen); |
| @@ -2106,7 +2106,7 @@ static int nfs_get_sb(struct file_system_type *fs_type, | |||
| 2106 | }; | 2106 | }; |
| 2107 | int error = -ENOMEM; | 2107 | int error = -ENOMEM; |
| 2108 | 2108 | ||
| 2109 | data = nfs_alloc_parsed_mount_data(NFS_MOUNT_VER3 | NFS_MOUNT_TCP); | 2109 | data = nfs_alloc_parsed_mount_data(3); |
| 2110 | mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL); | 2110 | mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL); |
| 2111 | if (data == NULL || mntfh == NULL) | 2111 | if (data == NULL || mntfh == NULL) |
| 2112 | goto out_free_fh; | 2112 | goto out_free_fh; |
| @@ -2331,7 +2331,7 @@ static int nfs4_validate_text_mount_data(void *options, | |||
| 2331 | { | 2331 | { |
| 2332 | struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address; | 2332 | struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address; |
| 2333 | 2333 | ||
| 2334 | nfs_set_default_port(sap, args->nfs_server.port, NFS_PORT); | 2334 | nfs_set_port(sap, &args->nfs_server.port, NFS_PORT); |
| 2335 | 2335 | ||
| 2336 | nfs_validate_transport_protocol(args); | 2336 | nfs_validate_transport_protocol(args); |
| 2337 | 2337 | ||
| @@ -2376,7 +2376,6 @@ static int nfs4_validate_mount_data(void *options, | |||
| 2376 | if (data == NULL) | 2376 | if (data == NULL) |
| 2377 | goto out_no_data; | 2377 | goto out_no_data; |
| 2378 | 2378 | ||
| 2379 | args->version = 4; | ||
| 2380 | switch (data->version) { | 2379 | switch (data->version) { |
| 2381 | case 1: | 2380 | case 1: |
| 2382 | if (data->host_addrlen > sizeof(args->nfs_server.address)) | 2381 | if (data->host_addrlen > sizeof(args->nfs_server.address)) |
| @@ -2660,7 +2659,7 @@ static int nfs4_get_sb(struct file_system_type *fs_type, | |||
| 2660 | struct nfs_parsed_mount_data *data; | 2659 | struct nfs_parsed_mount_data *data; |
| 2661 | int error = -ENOMEM; | 2660 | int error = -ENOMEM; |
| 2662 | 2661 | ||
| 2663 | data = nfs_alloc_parsed_mount_data(0); | 2662 | data = nfs_alloc_parsed_mount_data(4); |
| 2664 | if (data == NULL) | 2663 | if (data == NULL) |
| 2665 | goto out_free_data; | 2664 | goto out_free_data; |
| 2666 | 2665 | ||
| @@ -2690,7 +2689,6 @@ static void nfs4_kill_super(struct super_block *sb) | |||
| 2690 | dprintk("--> %s\n", __func__); | 2689 | dprintk("--> %s\n", __func__); |
| 2691 | nfs_super_return_all_delegations(sb); | 2690 | nfs_super_return_all_delegations(sb); |
| 2692 | kill_anon_super(sb); | 2691 | kill_anon_super(sb); |
| 2693 | nfs4_renewd_prepare_shutdown(server); | ||
| 2694 | nfs_fscache_release_super_cookie(sb); | 2692 | nfs_fscache_release_super_cookie(sb); |
| 2695 | nfs_free_server(server); | 2693 | nfs_free_server(server); |
| 2696 | dprintk("<-- %s\n", __func__); | 2694 | dprintk("<-- %s\n", __func__); |
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 56013371f9f3..a44a7897fd4d 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <asm/io.h> | 23 | #include <asm/io.h> |
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
| 25 | #include <linux/ioport.h> | 25 | #include <linux/ioport.h> |
| 26 | #include <linux/mm.h> | ||
| 27 | #include <linux/memory.h> | 26 | #include <linux/memory.h> |
| 28 | #include <asm/sections.h> | 27 | #include <asm/sections.h> |
| 29 | 28 | ||
diff --git a/fs/proc/page.c b/fs/proc/page.c index 2281c2cbfe2b..5033ce0d254b 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c | |||
| @@ -94,6 +94,7 @@ static const struct file_operations proc_kpagecount_operations = { | |||
| 94 | #define KPF_COMPOUND_TAIL 16 | 94 | #define KPF_COMPOUND_TAIL 16 |
| 95 | #define KPF_HUGE 17 | 95 | #define KPF_HUGE 17 |
| 96 | #define KPF_UNEVICTABLE 18 | 96 | #define KPF_UNEVICTABLE 18 |
| 97 | #define KPF_HWPOISON 19 | ||
| 97 | #define KPF_NOPAGE 20 | 98 | #define KPF_NOPAGE 20 |
| 98 | 99 | ||
| 99 | #define KPF_KSM 21 | 100 | #define KPF_KSM 21 |
| @@ -180,6 +181,10 @@ static u64 get_uflags(struct page *page) | |||
| 180 | u |= kpf_copy_bit(k, KPF_UNEVICTABLE, PG_unevictable); | 181 | u |= kpf_copy_bit(k, KPF_UNEVICTABLE, PG_unevictable); |
| 181 | u |= kpf_copy_bit(k, KPF_MLOCKED, PG_mlocked); | 182 | u |= kpf_copy_bit(k, KPF_MLOCKED, PG_mlocked); |
| 182 | 183 | ||
| 184 | #ifdef CONFIG_MEMORY_FAILURE | ||
| 185 | u |= kpf_copy_bit(k, KPF_HWPOISON, PG_hwpoison); | ||
| 186 | #endif | ||
| 187 | |||
| 183 | #ifdef CONFIG_IA64_UNCACHED_ALLOCATOR | 188 | #ifdef CONFIG_IA64_UNCACHED_ALLOCATOR |
| 184 | u |= kpf_copy_bit(k, KPF_UNCACHED, PG_uncached); | 189 | u |= kpf_copy_bit(k, KPF_UNCACHED, PG_uncached); |
| 185 | #endif | 190 | #endif |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 381854461b28..c2e30eea74dc 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
| @@ -186,19 +186,37 @@ xfs_destroy_ioend( | |||
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | /* | 188 | /* |
| 189 | * If the end of the current ioend is beyond the current EOF, | ||
| 190 | * return the new EOF value, otherwise zero. | ||
| 191 | */ | ||
| 192 | STATIC xfs_fsize_t | ||
| 193 | xfs_ioend_new_eof( | ||
| 194 | xfs_ioend_t *ioend) | ||
| 195 | { | ||
| 196 | xfs_inode_t *ip = XFS_I(ioend->io_inode); | ||
| 197 | xfs_fsize_t isize; | ||
| 198 | xfs_fsize_t bsize; | ||
| 199 | |||
| 200 | bsize = ioend->io_offset + ioend->io_size; | ||
| 201 | isize = MAX(ip->i_size, ip->i_new_size); | ||
| 202 | isize = MIN(isize, bsize); | ||
| 203 | return isize > ip->i_d.di_size ? isize : 0; | ||
| 204 | } | ||
| 205 | |||
| 206 | /* | ||
| 189 | * Update on-disk file size now that data has been written to disk. | 207 | * Update on-disk file size now that data has been written to disk. |
| 190 | * The current in-memory file size is i_size. If a write is beyond | 208 | * The current in-memory file size is i_size. If a write is beyond |
| 191 | * eof i_new_size will be the intended file size until i_size is | 209 | * eof i_new_size will be the intended file size until i_size is |
| 192 | * updated. If this write does not extend all the way to the valid | 210 | * updated. If this write does not extend all the way to the valid |
| 193 | * file size then restrict this update to the end of the write. | 211 | * file size then restrict this update to the end of the write. |
| 194 | */ | 212 | */ |
| 213 | |||
| 195 | STATIC void | 214 | STATIC void |
| 196 | xfs_setfilesize( | 215 | xfs_setfilesize( |
| 197 | xfs_ioend_t *ioend) | 216 | xfs_ioend_t *ioend) |
| 198 | { | 217 | { |
| 199 | xfs_inode_t *ip = XFS_I(ioend->io_inode); | 218 | xfs_inode_t *ip = XFS_I(ioend->io_inode); |
| 200 | xfs_fsize_t isize; | 219 | xfs_fsize_t isize; |
| 201 | xfs_fsize_t bsize; | ||
| 202 | 220 | ||
| 203 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); | 221 | ASSERT((ip->i_d.di_mode & S_IFMT) == S_IFREG); |
| 204 | ASSERT(ioend->io_type != IOMAP_READ); | 222 | ASSERT(ioend->io_type != IOMAP_READ); |
| @@ -206,16 +224,10 @@ xfs_setfilesize( | |||
| 206 | if (unlikely(ioend->io_error)) | 224 | if (unlikely(ioend->io_error)) |
| 207 | return; | 225 | return; |
| 208 | 226 | ||
| 209 | bsize = ioend->io_offset + ioend->io_size; | ||
| 210 | |||
| 211 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 227 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
| 212 | 228 | isize = xfs_ioend_new_eof(ioend); | |
| 213 | isize = MAX(ip->i_size, ip->i_new_size); | 229 | if (isize) { |
| 214 | isize = MIN(isize, bsize); | ||
| 215 | |||
| 216 | if (ip->i_d.di_size < isize) { | ||
| 217 | ip->i_d.di_size = isize; | 230 | ip->i_d.di_size = isize; |
| 218 | ip->i_update_core = 1; | ||
| 219 | xfs_mark_inode_dirty_sync(ip); | 231 | xfs_mark_inode_dirty_sync(ip); |
| 220 | } | 232 | } |
| 221 | 233 | ||
| @@ -404,10 +416,16 @@ xfs_submit_ioend_bio( | |||
| 404 | struct bio *bio) | 416 | struct bio *bio) |
| 405 | { | 417 | { |
| 406 | atomic_inc(&ioend->io_remaining); | 418 | atomic_inc(&ioend->io_remaining); |
| 407 | |||
| 408 | bio->bi_private = ioend; | 419 | bio->bi_private = ioend; |
| 409 | bio->bi_end_io = xfs_end_bio; | 420 | bio->bi_end_io = xfs_end_bio; |
| 410 | 421 | ||
| 422 | /* | ||
| 423 | * If the I/O is beyond EOF we mark the inode dirty immediately | ||
| 424 | * but don't update the inode size until I/O completion. | ||
| 425 | */ | ||
| 426 | if (xfs_ioend_new_eof(ioend)) | ||
| 427 | xfs_mark_inode_dirty_sync(XFS_I(ioend->io_inode)); | ||
| 428 | |||
| 411 | submit_bio(WRITE, bio); | 429 | submit_bio(WRITE, bio); |
| 412 | ASSERT(!bio_flagged(bio, BIO_EOPNOTSUPP)); | 430 | ASSERT(!bio_flagged(bio, BIO_EOPNOTSUPP)); |
| 413 | bio_put(bio); | 431 | bio_put(bio); |
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 629370974e57..eff61e2732af 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
| @@ -176,14 +176,7 @@ xfs_file_fsync( | |||
| 176 | struct dentry *dentry, | 176 | struct dentry *dentry, |
| 177 | int datasync) | 177 | int datasync) |
| 178 | { | 178 | { |
| 179 | struct inode *inode = dentry->d_inode; | 179 | struct xfs_inode *ip = XFS_I(dentry->d_inode); |
| 180 | struct xfs_inode *ip = XFS_I(inode); | ||
| 181 | int error; | ||
| 182 | |||
| 183 | /* capture size updates in I/O completion before writing the inode. */ | ||
| 184 | error = filemap_fdatawait(inode->i_mapping); | ||
| 185 | if (error) | ||
| 186 | return error; | ||
| 187 | 180 | ||
| 188 | xfs_iflags_clear(ip, XFS_ITRUNCATED); | 181 | xfs_iflags_clear(ip, XFS_ITRUNCATED); |
| 189 | return -xfs_fsync(ip); | 182 | return -xfs_fsync(ip); |
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index da0159d99f82..cd42ef78f6b5 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -57,19 +57,22 @@ | |||
| 57 | #include <linux/fiemap.h> | 57 | #include <linux/fiemap.h> |
| 58 | 58 | ||
| 59 | /* | 59 | /* |
| 60 | * Bring the atime in the XFS inode uptodate. | 60 | * Bring the timestamps in the XFS inode uptodate. |
| 61 | * Used before logging the inode to disk or when the Linux inode goes away. | 61 | * |
| 62 | * Used before writing the inode to disk. | ||
| 62 | */ | 63 | */ |
| 63 | void | 64 | void |
| 64 | xfs_synchronize_atime( | 65 | xfs_synchronize_times( |
| 65 | xfs_inode_t *ip) | 66 | xfs_inode_t *ip) |
| 66 | { | 67 | { |
| 67 | struct inode *inode = VFS_I(ip); | 68 | struct inode *inode = VFS_I(ip); |
| 68 | 69 | ||
| 69 | if (!(inode->i_state & I_CLEAR)) { | 70 | ip->i_d.di_atime.t_sec = (__int32_t)inode->i_atime.tv_sec; |
| 70 | ip->i_d.di_atime.t_sec = (__int32_t)inode->i_atime.tv_sec; | 71 | ip->i_d.di_atime.t_nsec = (__int32_t)inode->i_atime.tv_nsec; |
| 71 | ip->i_d.di_atime.t_nsec = (__int32_t)inode->i_atime.tv_nsec; | 72 | ip->i_d.di_ctime.t_sec = (__int32_t)inode->i_ctime.tv_sec; |
| 72 | } | 73 | ip->i_d.di_ctime.t_nsec = (__int32_t)inode->i_ctime.tv_nsec; |
| 74 | ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec; | ||
| 75 | ip->i_d.di_mtime.t_nsec = (__int32_t)inode->i_mtime.tv_nsec; | ||
| 73 | } | 76 | } |
| 74 | 77 | ||
| 75 | /* | 78 | /* |
| @@ -106,32 +109,20 @@ xfs_ichgtime( | |||
| 106 | if ((flags & XFS_ICHGTIME_MOD) && | 109 | if ((flags & XFS_ICHGTIME_MOD) && |
| 107 | !timespec_equal(&inode->i_mtime, &tv)) { | 110 | !timespec_equal(&inode->i_mtime, &tv)) { |
| 108 | inode->i_mtime = tv; | 111 | inode->i_mtime = tv; |
| 109 | ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec; | ||
| 110 | ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec; | ||
| 111 | sync_it = 1; | 112 | sync_it = 1; |
| 112 | } | 113 | } |
| 113 | if ((flags & XFS_ICHGTIME_CHG) && | 114 | if ((flags & XFS_ICHGTIME_CHG) && |
| 114 | !timespec_equal(&inode->i_ctime, &tv)) { | 115 | !timespec_equal(&inode->i_ctime, &tv)) { |
| 115 | inode->i_ctime = tv; | 116 | inode->i_ctime = tv; |
| 116 | ip->i_d.di_ctime.t_sec = (__int32_t)tv.tv_sec; | ||
| 117 | ip->i_d.di_ctime.t_nsec = (__int32_t)tv.tv_nsec; | ||
| 118 | sync_it = 1; | 117 | sync_it = 1; |
| 119 | } | 118 | } |
| 120 | 119 | ||
| 121 | /* | 120 | /* |
| 122 | * We update the i_update_core field _after_ changing | 121 | * Update complete - now make sure everyone knows that the inode |
| 123 | * the timestamps in order to coordinate properly with | 122 | * is dirty. |
| 124 | * xfs_iflush() so that we don't lose timestamp updates. | ||
| 125 | * This keeps us from having to hold the inode lock | ||
| 126 | * while doing this. We use the SYNCHRONIZE macro to | ||
| 127 | * ensure that the compiler does not reorder the update | ||
| 128 | * of i_update_core above the timestamp updates above. | ||
| 129 | */ | 123 | */ |
| 130 | if (sync_it) { | 124 | if (sync_it) |
| 131 | SYNCHRONIZE(); | ||
| 132 | ip->i_update_core = 1; | ||
| 133 | xfs_mark_inode_dirty_sync(ip); | 125 | xfs_mark_inode_dirty_sync(ip); |
| 134 | } | ||
| 135 | } | 126 | } |
| 136 | 127 | ||
| 137 | /* | 128 | /* |
| @@ -506,10 +497,8 @@ xfs_vn_getattr( | |||
| 506 | stat->gid = ip->i_d.di_gid; | 497 | stat->gid = ip->i_d.di_gid; |
| 507 | stat->ino = ip->i_ino; | 498 | stat->ino = ip->i_ino; |
| 508 | stat->atime = inode->i_atime; | 499 | stat->atime = inode->i_atime; |
| 509 | stat->mtime.tv_sec = ip->i_d.di_mtime.t_sec; | 500 | stat->mtime = inode->i_mtime; |
| 510 | stat->mtime.tv_nsec = ip->i_d.di_mtime.t_nsec; | 501 | stat->ctime = inode->i_ctime; |
| 511 | stat->ctime.tv_sec = ip->i_d.di_ctime.t_sec; | ||
| 512 | stat->ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; | ||
| 513 | stat->blocks = | 502 | stat->blocks = |
| 514 | XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks); | 503 | XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks); |
| 515 | 504 | ||
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 49e4a6aea73c..072050f8d346 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
| @@ -667,7 +667,7 @@ start: | |||
| 667 | xip->i_new_size = new_size; | 667 | xip->i_new_size = new_size; |
| 668 | 668 | ||
| 669 | if (likely(!(ioflags & IO_INVIS))) | 669 | if (likely(!(ioflags & IO_INVIS))) |
| 670 | xfs_ichgtime(xip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | 670 | file_update_time(file); |
| 671 | 671 | ||
| 672 | /* | 672 | /* |
| 673 | * If the offset is beyond the size of the file, we have a couple | 673 | * If the offset is beyond the size of the file, we have a couple |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index bdd41c8c342f..18a4b8e11df2 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
| @@ -977,6 +977,28 @@ xfs_fs_inode_init_once( | |||
| 977 | } | 977 | } |
| 978 | 978 | ||
| 979 | /* | 979 | /* |
| 980 | * Dirty the XFS inode when mark_inode_dirty_sync() is called so that | ||
| 981 | * we catch unlogged VFS level updates to the inode. Care must be taken | ||
| 982 | * here - the transaction code calls mark_inode_dirty_sync() to mark the | ||
| 983 | * VFS inode dirty in a transaction and clears the i_update_core field; | ||
| 984 | * it must clear the field after calling mark_inode_dirty_sync() to | ||
| 985 | * correctly indicate that the dirty state has been propagated into the | ||
| 986 | * inode log item. | ||
| 987 | * | ||
| 988 | * We need the barrier() to maintain correct ordering between unlogged | ||
| 989 | * updates and the transaction commit code that clears the i_update_core | ||
| 990 | * field. This requires all updates to be completed before marking the | ||
| 991 | * inode dirty. | ||
| 992 | */ | ||
| 993 | STATIC void | ||
| 994 | xfs_fs_dirty_inode( | ||
| 995 | struct inode *inode) | ||
| 996 | { | ||
| 997 | barrier(); | ||
| 998 | XFS_I(inode)->i_update_core = 1; | ||
| 999 | } | ||
| 1000 | |||
| 1001 | /* | ||
| 980 | * Attempt to flush the inode, this will actually fail | 1002 | * Attempt to flush the inode, this will actually fail |
| 981 | * if the inode is pinned, but we dirty the inode again | 1003 | * if the inode is pinned, but we dirty the inode again |
| 982 | * at the point when it is unpinned after a log write, | 1004 | * at the point when it is unpinned after a log write, |
| @@ -1126,7 +1148,7 @@ xfs_fs_put_super( | |||
| 1126 | } | 1148 | } |
| 1127 | 1149 | ||
| 1128 | STATIC int | 1150 | STATIC int |
| 1129 | xfs_fs_sync_super( | 1151 | xfs_fs_sync_fs( |
| 1130 | struct super_block *sb, | 1152 | struct super_block *sb, |
| 1131 | int wait) | 1153 | int wait) |
| 1132 | { | 1154 | { |
| @@ -1134,23 +1156,23 @@ xfs_fs_sync_super( | |||
| 1134 | int error; | 1156 | int error; |
| 1135 | 1157 | ||
| 1136 | /* | 1158 | /* |
| 1137 | * Treat a sync operation like a freeze. This is to work | 1159 | * Not much we can do for the first async pass. Writing out the |
| 1138 | * around a race in sync_inodes() which works in two phases | 1160 | * superblock would be counter-productive as we are going to redirty |
| 1139 | * - an asynchronous flush, which can write out an inode | 1161 | * when writing out other data and metadata (and writing out a single |
| 1140 | * without waiting for file size updates to complete, and a | 1162 | * block is quite fast anyway). |
| 1141 | * synchronous flush, which wont do anything because the | 1163 | * |
| 1142 | * async flush removed the inode's dirty flag. Also | 1164 | * Try to asynchronously kick off quota syncing at least. |
| 1143 | * sync_inodes() will not see any files that just have | ||
| 1144 | * outstanding transactions to be flushed because we don't | ||
| 1145 | * dirty the Linux inode until after the transaction I/O | ||
| 1146 | * completes. | ||
| 1147 | */ | 1165 | */ |
| 1148 | if (wait || unlikely(sb->s_frozen == SB_FREEZE_WRITE)) | 1166 | if (!wait) { |
| 1149 | error = xfs_quiesce_data(mp); | 1167 | xfs_qm_sync(mp, SYNC_TRYLOCK); |
| 1150 | else | 1168 | return 0; |
| 1151 | error = xfs_sync_fsdata(mp, 0); | 1169 | } |
| 1170 | |||
| 1171 | error = xfs_quiesce_data(mp); | ||
| 1172 | if (error) | ||
| 1173 | return -error; | ||
| 1152 | 1174 | ||
| 1153 | if (unlikely(laptop_mode)) { | 1175 | if (laptop_mode) { |
| 1154 | int prev_sync_seq = mp->m_sync_seq; | 1176 | int prev_sync_seq = mp->m_sync_seq; |
| 1155 | 1177 | ||
| 1156 | /* | 1178 | /* |
| @@ -1169,7 +1191,7 @@ xfs_fs_sync_super( | |||
| 1169 | mp->m_sync_seq != prev_sync_seq); | 1191 | mp->m_sync_seq != prev_sync_seq); |
| 1170 | } | 1192 | } |
| 1171 | 1193 | ||
| 1172 | return -error; | 1194 | return 0; |
| 1173 | } | 1195 | } |
| 1174 | 1196 | ||
| 1175 | STATIC int | 1197 | STATIC int |
| @@ -1539,10 +1561,11 @@ xfs_fs_get_sb( | |||
| 1539 | static const struct super_operations xfs_super_operations = { | 1561 | static const struct super_operations xfs_super_operations = { |
| 1540 | .alloc_inode = xfs_fs_alloc_inode, | 1562 | .alloc_inode = xfs_fs_alloc_inode, |
| 1541 | .destroy_inode = xfs_fs_destroy_inode, | 1563 | .destroy_inode = xfs_fs_destroy_inode, |
| 1564 | .dirty_inode = xfs_fs_dirty_inode, | ||
| 1542 | .write_inode = xfs_fs_write_inode, | 1565 | .write_inode = xfs_fs_write_inode, |
| 1543 | .clear_inode = xfs_fs_clear_inode, | 1566 | .clear_inode = xfs_fs_clear_inode, |
| 1544 | .put_super = xfs_fs_put_super, | 1567 | .put_super = xfs_fs_put_super, |
| 1545 | .sync_fs = xfs_fs_sync_super, | 1568 | .sync_fs = xfs_fs_sync_fs, |
| 1546 | .freeze_fs = xfs_fs_freeze, | 1569 | .freeze_fs = xfs_fs_freeze, |
| 1547 | .statfs = xfs_fs_statfs, | 1570 | .statfs = xfs_fs_statfs, |
| 1548 | .remount_fs = xfs_fs_remount, | 1571 | .remount_fs = xfs_fs_remount, |
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 320be6aea492..961df0a22c78 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
| @@ -309,11 +309,15 @@ xfs_sync_attr( | |||
| 309 | STATIC int | 309 | STATIC int |
| 310 | xfs_commit_dummy_trans( | 310 | xfs_commit_dummy_trans( |
| 311 | struct xfs_mount *mp, | 311 | struct xfs_mount *mp, |
| 312 | uint log_flags) | 312 | uint flags) |
| 313 | { | 313 | { |
| 314 | struct xfs_inode *ip = mp->m_rootip; | 314 | struct xfs_inode *ip = mp->m_rootip; |
| 315 | struct xfs_trans *tp; | 315 | struct xfs_trans *tp; |
| 316 | int error; | 316 | int error; |
| 317 | int log_flags = XFS_LOG_FORCE; | ||
| 318 | |||
| 319 | if (flags & SYNC_WAIT) | ||
| 320 | log_flags |= XFS_LOG_SYNC; | ||
| 317 | 321 | ||
| 318 | /* | 322 | /* |
| 319 | * Put a dummy transaction in the log to tell recovery | 323 | * Put a dummy transaction in the log to tell recovery |
| @@ -331,13 +335,12 @@ xfs_commit_dummy_trans( | |||
| 331 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); | 335 | xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); |
| 332 | xfs_trans_ihold(tp, ip); | 336 | xfs_trans_ihold(tp, ip); |
| 333 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 337 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
| 334 | /* XXX(hch): ignoring the error here.. */ | ||
| 335 | error = xfs_trans_commit(tp, 0); | 338 | error = xfs_trans_commit(tp, 0); |
| 336 | |||
| 337 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 339 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
| 338 | 340 | ||
| 341 | /* the log force ensures this transaction is pushed to disk */ | ||
| 339 | xfs_log_force(mp, 0, log_flags); | 342 | xfs_log_force(mp, 0, log_flags); |
| 340 | return 0; | 343 | return error; |
| 341 | } | 344 | } |
| 342 | 345 | ||
| 343 | int | 346 | int |
| @@ -385,7 +388,20 @@ xfs_sync_fsdata( | |||
| 385 | else | 388 | else |
| 386 | XFS_BUF_ASYNC(bp); | 389 | XFS_BUF_ASYNC(bp); |
| 387 | 390 | ||
| 388 | return xfs_bwrite(mp, bp); | 391 | error = xfs_bwrite(mp, bp); |
| 392 | if (error) | ||
| 393 | return error; | ||
| 394 | |||
| 395 | /* | ||
| 396 | * If this is a data integrity sync make sure all pending buffers | ||
| 397 | * are flushed out for the log coverage check below. | ||
| 398 | */ | ||
| 399 | if (flags & SYNC_WAIT) | ||
| 400 | xfs_flush_buftarg(mp->m_ddev_targp, 1); | ||
| 401 | |||
| 402 | if (xfs_log_need_covered(mp)) | ||
| 403 | error = xfs_commit_dummy_trans(mp, flags); | ||
| 404 | return error; | ||
| 389 | 405 | ||
| 390 | out_brelse: | 406 | out_brelse: |
| 391 | xfs_buf_relse(bp); | 407 | xfs_buf_relse(bp); |
| @@ -419,14 +435,16 @@ xfs_quiesce_data( | |||
| 419 | /* push non-blocking */ | 435 | /* push non-blocking */ |
| 420 | xfs_sync_data(mp, 0); | 436 | xfs_sync_data(mp, 0); |
| 421 | xfs_qm_sync(mp, SYNC_TRYLOCK); | 437 | xfs_qm_sync(mp, SYNC_TRYLOCK); |
| 422 | xfs_filestream_flush(mp); | ||
| 423 | 438 | ||
| 424 | /* push and block */ | 439 | /* push and block till complete */ |
| 425 | xfs_sync_data(mp, SYNC_WAIT); | 440 | xfs_sync_data(mp, SYNC_WAIT); |
| 426 | xfs_qm_sync(mp, SYNC_WAIT); | 441 | xfs_qm_sync(mp, SYNC_WAIT); |
| 427 | 442 | ||
| 443 | /* drop inode references pinned by filestreams */ | ||
| 444 | xfs_filestream_flush(mp); | ||
| 445 | |||
| 428 | /* write superblock and hoover up shutdown errors */ | 446 | /* write superblock and hoover up shutdown errors */ |
| 429 | error = xfs_sync_fsdata(mp, 0); | 447 | error = xfs_sync_fsdata(mp, SYNC_WAIT); |
| 430 | 448 | ||
| 431 | /* flush data-only devices */ | 449 | /* flush data-only devices */ |
| 432 | if (mp->m_rtdev_targp) | 450 | if (mp->m_rtdev_targp) |
| @@ -570,8 +588,6 @@ xfs_sync_worker( | |||
| 570 | /* dgc: errors ignored here */ | 588 | /* dgc: errors ignored here */ |
| 571 | error = xfs_qm_sync(mp, SYNC_TRYLOCK); | 589 | error = xfs_qm_sync(mp, SYNC_TRYLOCK); |
| 572 | error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); | 590 | error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); |
| 573 | if (xfs_log_need_covered(mp)) | ||
| 574 | error = xfs_commit_dummy_trans(mp, XFS_LOG_FORCE); | ||
| 575 | } | 591 | } |
| 576 | mp->m_sync_seq++; | 592 | mp->m_sync_seq++; |
| 577 | wake_up(&mp->m_wait_single_sync_task); | 593 | wake_up(&mp->m_wait_single_sync_task); |
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index 7465f9ee125f..ab89a7e94a0f 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
| @@ -206,10 +206,10 @@ xfs_swap_extents( | |||
| 206 | * process that the file was not changed out from | 206 | * process that the file was not changed out from |
| 207 | * under it. | 207 | * under it. |
| 208 | */ | 208 | */ |
| 209 | if ((sbp->bs_ctime.tv_sec != ip->i_d.di_ctime.t_sec) || | 209 | if ((sbp->bs_ctime.tv_sec != VFS_I(ip)->i_ctime.tv_sec) || |
| 210 | (sbp->bs_ctime.tv_nsec != ip->i_d.di_ctime.t_nsec) || | 210 | (sbp->bs_ctime.tv_nsec != VFS_I(ip)->i_ctime.tv_nsec) || |
| 211 | (sbp->bs_mtime.tv_sec != ip->i_d.di_mtime.t_sec) || | 211 | (sbp->bs_mtime.tv_sec != VFS_I(ip)->i_mtime.tv_sec) || |
| 212 | (sbp->bs_mtime.tv_nsec != ip->i_d.di_mtime.t_nsec)) { | 212 | (sbp->bs_mtime.tv_nsec != VFS_I(ip)->i_mtime.tv_nsec)) { |
| 213 | error = XFS_ERROR(EBUSY); | 213 | error = XFS_ERROR(EBUSY); |
| 214 | goto out_unlock; | 214 | goto out_unlock; |
| 215 | } | 215 | } |
diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index fa913e459442..41ad537c49e9 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c | |||
| @@ -854,6 +854,7 @@ xfs_dir2_leaf_getdents( | |||
| 854 | */ | 854 | */ |
| 855 | ra_want = howmany(bufsize + mp->m_dirblksize, | 855 | ra_want = howmany(bufsize + mp->m_dirblksize, |
| 856 | mp->m_sb.sb_blocksize) - 1; | 856 | mp->m_sb.sb_blocksize) - 1; |
| 857 | ASSERT(ra_want >= 0); | ||
| 857 | 858 | ||
| 858 | /* | 859 | /* |
| 859 | * If we don't have as many as we want, and we haven't | 860 | * If we don't have as many as we want, and we haven't |
| @@ -1088,7 +1089,8 @@ xfs_dir2_leaf_getdents( | |||
| 1088 | */ | 1089 | */ |
| 1089 | ptr += length; | 1090 | ptr += length; |
| 1090 | curoff += length; | 1091 | curoff += length; |
| 1091 | bufsize -= length; | 1092 | /* bufsize may have just been a guess; don't go negative */ |
| 1093 | bufsize = bufsize > length ? bufsize - length : 0; | ||
| 1092 | } | 1094 | } |
| 1093 | 1095 | ||
| 1094 | /* | 1096 | /* |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c1dc7ef5a1d8..b92a4fa2a0a1 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -3068,9 +3068,9 @@ xfs_iflush_int( | |||
| 3068 | SYNCHRONIZE(); | 3068 | SYNCHRONIZE(); |
| 3069 | 3069 | ||
| 3070 | /* | 3070 | /* |
| 3071 | * Make sure to get the latest atime from the Linux inode. | 3071 | * Make sure to get the latest timestamps from the Linux inode. |
| 3072 | */ | 3072 | */ |
| 3073 | xfs_synchronize_atime(ip); | 3073 | xfs_synchronize_times(ip); |
| 3074 | 3074 | ||
| 3075 | if (XFS_TEST_ERROR(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC, | 3075 | if (XFS_TEST_ERROR(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC, |
| 3076 | mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) { | 3076 | mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) { |
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 0b38b9a869ec..41555de1d1db 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -504,7 +504,7 @@ void xfs_ichgtime(xfs_inode_t *, int); | |||
| 504 | void xfs_lock_inodes(xfs_inode_t **, int, uint); | 504 | void xfs_lock_inodes(xfs_inode_t **, int, uint); |
| 505 | void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); | 505 | void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); |
| 506 | 506 | ||
| 507 | void xfs_synchronize_atime(xfs_inode_t *); | 507 | void xfs_synchronize_times(xfs_inode_t *); |
| 508 | void xfs_mark_inode_dirty_sync(xfs_inode_t *); | 508 | void xfs_mark_inode_dirty_sync(xfs_inode_t *); |
| 509 | 509 | ||
| 510 | #if defined(XFS_INODE_TRACE) | 510 | #if defined(XFS_INODE_TRACE) |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 47d5b663c37e..9794b876d6ff 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
| @@ -232,6 +232,15 @@ xfs_inode_item_format( | |||
| 232 | nvecs = 1; | 232 | nvecs = 1; |
| 233 | 233 | ||
| 234 | /* | 234 | /* |
| 235 | * Make sure the linux inode is dirty. We do this before | ||
| 236 | * clearing i_update_core as the VFS will call back into | ||
| 237 | * XFS here and set i_update_core, so we need to dirty the | ||
| 238 | * inode first so that the ordering of i_update_core and | ||
| 239 | * unlogged modifications still works as described below. | ||
| 240 | */ | ||
| 241 | xfs_mark_inode_dirty_sync(ip); | ||
| 242 | |||
| 243 | /* | ||
| 235 | * Clear i_update_core if the timestamps (or any other | 244 | * Clear i_update_core if the timestamps (or any other |
| 236 | * non-transactional modification) need flushing/logging | 245 | * non-transactional modification) need flushing/logging |
| 237 | * and we're about to log them with the rest of the core. | 246 | * and we're about to log them with the rest of the core. |
| @@ -263,14 +272,9 @@ xfs_inode_item_format( | |||
| 263 | } | 272 | } |
| 264 | 273 | ||
| 265 | /* | 274 | /* |
| 266 | * Make sure to get the latest atime from the Linux inode. | 275 | * Make sure to get the latest timestamps from the Linux inode. |
| 267 | */ | 276 | */ |
| 268 | xfs_synchronize_atime(ip); | 277 | xfs_synchronize_times(ip); |
| 269 | |||
| 270 | /* | ||
| 271 | * make sure the linux inode is dirty | ||
| 272 | */ | ||
| 273 | xfs_mark_inode_dirty_sync(ip); | ||
| 274 | 278 | ||
| 275 | vecp->i_addr = (xfs_caddr_t)&ip->i_d; | 279 | vecp->i_addr = (xfs_caddr_t)&ip->i_d; |
| 276 | vecp->i_len = sizeof(struct xfs_icdinode); | 280 | vecp->i_len = sizeof(struct xfs_icdinode); |
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b68f9107e26c..62efab2f3839 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c | |||
| @@ -59,6 +59,7 @@ xfs_bulkstat_one_iget( | |||
| 59 | { | 59 | { |
| 60 | xfs_icdinode_t *dic; /* dinode core info pointer */ | 60 | xfs_icdinode_t *dic; /* dinode core info pointer */ |
| 61 | xfs_inode_t *ip; /* incore inode pointer */ | 61 | xfs_inode_t *ip; /* incore inode pointer */ |
| 62 | struct inode *inode; | ||
| 62 | int error; | 63 | int error; |
| 63 | 64 | ||
| 64 | error = xfs_iget(mp, NULL, ino, | 65 | error = xfs_iget(mp, NULL, ino, |
| @@ -72,6 +73,7 @@ xfs_bulkstat_one_iget( | |||
| 72 | ASSERT(ip->i_imap.im_blkno != 0); | 73 | ASSERT(ip->i_imap.im_blkno != 0); |
| 73 | 74 | ||
| 74 | dic = &ip->i_d; | 75 | dic = &ip->i_d; |
| 76 | inode = VFS_I(ip); | ||
| 75 | 77 | ||
| 76 | /* xfs_iget returns the following without needing | 78 | /* xfs_iget returns the following without needing |
| 77 | * further change. | 79 | * further change. |
| @@ -83,16 +85,19 @@ xfs_bulkstat_one_iget( | |||
| 83 | buf->bs_uid = dic->di_uid; | 85 | buf->bs_uid = dic->di_uid; |
| 84 | buf->bs_gid = dic->di_gid; | 86 | buf->bs_gid = dic->di_gid; |
| 85 | buf->bs_size = dic->di_size; | 87 | buf->bs_size = dic->di_size; |
| 88 | |||
| 86 | /* | 89 | /* |
| 87 | * We are reading the atime from the Linux inode because the | 90 | * We need to read the timestamps from the Linux inode because |
| 88 | * dinode might not be uptodate. | 91 | * the VFS keeps writing directly into the inode structure instead |
| 92 | * of telling us about the updates. | ||
| 89 | */ | 93 | */ |
| 90 | buf->bs_atime.tv_sec = VFS_I(ip)->i_atime.tv_sec; | 94 | buf->bs_atime.tv_sec = inode->i_atime.tv_sec; |
| 91 | buf->bs_atime.tv_nsec = VFS_I(ip)->i_atime.tv_nsec; | 95 | buf->bs_atime.tv_nsec = inode->i_atime.tv_nsec; |
| 92 | buf->bs_mtime.tv_sec = dic->di_mtime.t_sec; | 96 | buf->bs_mtime.tv_sec = inode->i_mtime.tv_sec; |
| 93 | buf->bs_mtime.tv_nsec = dic->di_mtime.t_nsec; | 97 | buf->bs_mtime.tv_nsec = inode->i_mtime.tv_nsec; |
| 94 | buf->bs_ctime.tv_sec = dic->di_ctime.t_sec; | 98 | buf->bs_ctime.tv_sec = inode->i_ctime.tv_sec; |
| 95 | buf->bs_ctime.tv_nsec = dic->di_ctime.t_nsec; | 99 | buf->bs_ctime.tv_nsec = inode->i_ctime.tv_nsec; |
| 100 | |||
| 96 | buf->bs_xflags = xfs_ip2xflags(ip); | 101 | buf->bs_xflags = xfs_ip2xflags(ip); |
| 97 | buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; | 102 | buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; |
| 98 | buf->bs_extents = dic->di_nextents; | 103 | buf->bs_extents = dic->di_nextents; |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index a434f287962d..b572f7e840e0 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -2476,12 +2476,6 @@ xfs_reclaim( | |||
| 2476 | ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); | 2476 | ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); |
| 2477 | 2477 | ||
| 2478 | /* | 2478 | /* |
| 2479 | * Make sure the atime in the XFS inode is correct before freeing the | ||
| 2480 | * Linux inode. | ||
| 2481 | */ | ||
| 2482 | xfs_synchronize_atime(ip); | ||
| 2483 | |||
| 2484 | /* | ||
| 2485 | * If we have nothing to flush with this inode then complete the | 2479 | * If we have nothing to flush with this inode then complete the |
| 2486 | * teardown now, otherwise break the link between the xfs inode and the | 2480 | * teardown now, otherwise break the link between the xfs inode and the |
| 2487 | * linux inode and clean up the xfs inode later. This avoids flushing | 2481 | * linux inode and clean up the xfs inode later. This avoids flushing |
diff --git a/include/asm-generic/hardirq.h b/include/asm-generic/hardirq.h index 23bb4dad4962..62f59080e5cc 100644 --- a/include/asm-generic/hardirq.h +++ b/include/asm-generic/hardirq.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | #include <linux/irq.h> | 6 | #include <linux/irq.h> |
| 7 | 7 | ||
| 8 | typedef struct { | 8 | typedef struct { |
| 9 | unsigned long __softirq_pending; | 9 | unsigned int __softirq_pending; |
| 10 | } ____cacheline_aligned irq_cpustat_t; | 10 | } ____cacheline_aligned irq_cpustat_t; |
| 11 | 11 | ||
| 12 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ | 12 | #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */ |
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index ef47dfd8e5e9..b29e20168b5f 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h | |||
| @@ -61,6 +61,9 @@ struct drm_crtc_helper_funcs { | |||
| 61 | /* Move the crtc on the current fb to the given position *optional* */ | 61 | /* Move the crtc on the current fb to the given position *optional* */ |
| 62 | int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, | 62 | int (*mode_set_base)(struct drm_crtc *crtc, int x, int y, |
| 63 | struct drm_framebuffer *old_fb); | 63 | struct drm_framebuffer *old_fb); |
| 64 | |||
| 65 | /* reload the current crtc LUT */ | ||
| 66 | void (*load_lut)(struct drm_crtc *crtc); | ||
| 64 | }; | 67 | }; |
| 65 | 68 | ||
| 66 | struct drm_encoder_helper_funcs { | 69 | struct drm_encoder_helper_funcs { |
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index 4aa5740ce59f..58c892a2cbfa 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h | |||
| @@ -39,6 +39,8 @@ struct drm_fb_helper_crtc { | |||
| 39 | struct drm_fb_helper_funcs { | 39 | struct drm_fb_helper_funcs { |
| 40 | void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green, | 40 | void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green, |
| 41 | u16 blue, int regno); | 41 | u16 blue, int regno); |
| 42 | void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
| 43 | u16 *blue, int regno); | ||
| 42 | }; | 44 | }; |
| 43 | 45 | ||
| 44 | /* mode specified on the command line */ | 46 | /* mode specified on the command line */ |
| @@ -71,6 +73,7 @@ struct drm_fb_helper { | |||
| 71 | }; | 73 | }; |
| 72 | 74 | ||
| 73 | int drm_fb_helper_single_fb_probe(struct drm_device *dev, | 75 | int drm_fb_helper_single_fb_probe(struct drm_device *dev, |
| 76 | int preferred_bpp, | ||
| 74 | int (*fb_create)(struct drm_device *dev, | 77 | int (*fb_create)(struct drm_device *dev, |
| 75 | uint32_t fb_width, | 78 | uint32_t fb_width, |
| 76 | uint32_t fb_height, | 79 | uint32_t fb_height, |
| @@ -98,9 +101,11 @@ int drm_fb_helper_setcolreg(unsigned regno, | |||
| 98 | void drm_fb_helper_restore(void); | 101 | void drm_fb_helper_restore(void); |
| 99 | void drm_fb_helper_fill_var(struct fb_info *info, struct drm_framebuffer *fb, | 102 | void drm_fb_helper_fill_var(struct fb_info *info, struct drm_framebuffer *fb, |
| 100 | uint32_t fb_width, uint32_t fb_height); | 103 | uint32_t fb_width, uint32_t fb_height); |
| 101 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch); | 104 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, |
| 105 | uint32_t depth); | ||
| 102 | 106 | ||
| 103 | int drm_fb_helper_add_connector(struct drm_connector *connector); | 107 | int drm_fb_helper_add_connector(struct drm_connector *connector); |
| 104 | int drm_fb_helper_parse_command_line(struct drm_device *dev); | 108 | int drm_fb_helper_parse_command_line(struct drm_device *dev); |
| 109 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info); | ||
| 105 | 110 | ||
| 106 | #endif | 111 | #endif |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 3f6e545609be..e6f3b120f51a 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -80,7 +80,7 @@ | |||
| 80 | {0x1002, 0x5158, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200}, \ | 80 | {0x1002, 0x5158, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200}, \ |
| 81 | {0x1002, 0x5159, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ | 81 | {0x1002, 0x5159, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ |
| 82 | {0x1002, 0x515A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ | 82 | {0x1002, 0x515A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ |
| 83 | {0x1002, 0x515E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ | 83 | {0x1002, 0x515E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100|RADEON_SINGLE_CRTC}, \ |
| 84 | {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ | 84 | {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
| 85 | {0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ | 85 | {0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
| 86 | {0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ | 86 | {0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
| @@ -113,7 +113,7 @@ | |||
| 113 | {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 113 | {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
| 114 | {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 114 | {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
| 115 | {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 115 | {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
| 116 | {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ | 116 | {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100|RADEON_SINGLE_CRTC}, \ |
| 117 | {0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART}, \ | 117 | {0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART}, \ |
| 118 | {0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | 118 | {0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ |
| 119 | {0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART}, \ | 119 | {0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART}, \ |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index cff4a101f266..3f384d4b163a 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
| @@ -126,6 +126,7 @@ header-y += nfs_mount.h | |||
| 126 | header-y += nl80211.h | 126 | header-y += nl80211.h |
| 127 | header-y += param.h | 127 | header-y += param.h |
| 128 | header-y += pci_regs.h | 128 | header-y += pci_regs.h |
| 129 | header-y += perf_event.h | ||
| 129 | header-y += pfkeyv2.h | 130 | header-y += pfkeyv2.h |
| 130 | header-y += pg.h | 131 | header-y += pg.h |
| 131 | header-y += phantom.h | 132 | header-y += phantom.h |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 6299a259ed19..4fb357312b3b 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -334,9 +334,12 @@ enum { | |||
| 334 | SETFEATURES_SATA_DISABLE = 0x90, /* Disable use of SATA feature */ | 334 | SETFEATURES_SATA_DISABLE = 0x90, /* Disable use of SATA feature */ |
| 335 | 335 | ||
| 336 | /* SETFEATURE Sector counts for SATA features */ | 336 | /* SETFEATURE Sector counts for SATA features */ |
| 337 | SATA_AN = 0x05, /* Asynchronous Notification */ | 337 | SATA_FPDMA_OFFSET = 0x01, /* FPDMA non-zero buffer offsets */ |
| 338 | SATA_DIPM = 0x03, /* Device Initiated Power Management */ | 338 | SATA_FPDMA_AA = 0x02, /* FPDMA Setup FIS Auto-Activate */ |
| 339 | SATA_FPDMA_AA = 0x02, /* DMA Setup FIS Auto-Activate */ | 339 | SATA_DIPM = 0x03, /* Device Initiated Power Management */ |
| 340 | SATA_FPDMA_IN_ORDER = 0x04, /* FPDMA in-order data delivery */ | ||
| 341 | SATA_AN = 0x05, /* Asynchronous Notification */ | ||
| 342 | SATA_SSP = 0x06, /* Software Settings Preservation */ | ||
| 340 | 343 | ||
| 341 | /* feature values for SET_MAX */ | 344 | /* feature values for SET_MAX */ |
| 342 | ATA_SET_MAX_ADDR = 0x00, | 345 | ATA_SET_MAX_ADDR = 0x00, |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index cd3d2abaf30a..0b4f97d24d7f 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -241,7 +241,7 @@ extern void ftrace_enable_daemon(void); | |||
| 241 | # define ftrace_set_filter(buf, len, reset) do { } while (0) | 241 | # define ftrace_set_filter(buf, len, reset) do { } while (0) |
| 242 | # define ftrace_disable_daemon() do { } while (0) | 242 | # define ftrace_disable_daemon() do { } while (0) |
| 243 | # define ftrace_enable_daemon() do { } while (0) | 243 | # define ftrace_enable_daemon() do { } while (0) |
| 244 | static inline void ftrace_release(void *start, unsigned long size) { } | 244 | static inline void ftrace_release_mod(struct module *mod) {} |
| 245 | static inline int register_ftrace_command(struct ftrace_func_command *cmd) | 245 | static inline int register_ftrace_command(struct ftrace_func_command *cmd) |
| 246 | { | 246 | { |
| 247 | return -EINVAL; | 247 | return -EINVAL; |
diff --git a/include/linux/futex.h b/include/linux/futex.h index 8ec17997d94f..1e5a26d79232 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h | |||
| @@ -33,8 +33,8 @@ | |||
| 33 | #define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) | 33 | #define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) |
| 34 | #define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) | 34 | #define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) |
| 35 | #define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) | 35 | #define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) |
| 36 | #define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITS | FUTEX_PRIVATE_FLAG) | 36 | #define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG) |
| 37 | #define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITS | FUTEX_PRIVATE_FLAG) | 37 | #define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG) |
| 38 | #define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | \ | 38 | #define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | \ |
| 39 | FUTEX_PRIVATE_FLAG) | 39 | FUTEX_PRIVATE_FLAG) |
| 40 | #define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \ | 40 | #define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \ |
diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h index 2d02dfd7076c..508824ee35e6 100644 --- a/include/linux/i2c/twl4030.h +++ b/include/linux/i2c/twl4030.h | |||
| @@ -349,11 +349,11 @@ struct twl4030_madc_platform_data { | |||
| 349 | int irq_line; | 349 | int irq_line; |
| 350 | }; | 350 | }; |
| 351 | 351 | ||
| 352 | /* Boards have uniqe mappings of {col, row} --> keycode. | 352 | /* Boards have uniqe mappings of {row, col} --> keycode. |
| 353 | * Column and row are 4 bits, but range only from 0..7. | 353 | * Column and row are 8 bits each, but range only from 0..7. |
| 354 | * a PERSISTENT_KEY is "always on" and never reported. | 354 | * a PERSISTENT_KEY is "always on" and never reported. |
| 355 | */ | 355 | */ |
| 356 | #define PERSISTENT_KEY(c, r) KEY((c), (r), KEY_RESERVED) | 356 | #define PERSISTENT_KEY(r, c) KEY((r), (c), KEY_RESERVED) |
| 357 | 357 | ||
| 358 | struct twl4030_keypad_data { | 358 | struct twl4030_keypad_data { |
| 359 | const struct matrix_keymap_data *keymap_data; | 359 | const struct matrix_keymap_data *keymap_data; |
diff --git a/include/linux/init.h b/include/linux/init.h index 400adbb45414..ff8bde520d03 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
| @@ -271,6 +271,7 @@ void __init parse_early_options(char *cmdline); | |||
| 271 | #else /* MODULE */ | 271 | #else /* MODULE */ |
| 272 | 272 | ||
| 273 | /* Don't use these in modules, but some people do... */ | 273 | /* Don't use these in modules, but some people do... */ |
| 274 | #define early_initcall(fn) module_init(fn) | ||
| 274 | #define core_initcall(fn) module_init(fn) | 275 | #define core_initcall(fn) module_init(fn) |
| 275 | #define postcore_initcall(fn) module_init(fn) | 276 | #define postcore_initcall(fn) module_init(fn) |
| 276 | #define arch_initcall(fn) module_init(fn) | 277 | #define arch_initcall(fn) module_init(fn) |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 76319bf03e37..87698640c091 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -418,6 +418,17 @@ enum { | |||
| 418 | ATA_TIMING_ACTIVE | ATA_TIMING_RECOVER | | 418 | ATA_TIMING_ACTIVE | ATA_TIMING_RECOVER | |
| 419 | ATA_TIMING_DMACK_HOLD | ATA_TIMING_CYCLE | | 419 | ATA_TIMING_DMACK_HOLD | ATA_TIMING_CYCLE | |
| 420 | ATA_TIMING_UDMA, | 420 | ATA_TIMING_UDMA, |
| 421 | |||
| 422 | /* ACPI constants */ | ||
| 423 | ATA_ACPI_FILTER_SETXFER = 1 << 0, | ||
| 424 | ATA_ACPI_FILTER_LOCK = 1 << 1, | ||
| 425 | ATA_ACPI_FILTER_DIPM = 1 << 2, | ||
| 426 | ATA_ACPI_FILTER_FPDMA_OFFSET = 1 << 3, /* FPDMA non-zero offset */ | ||
| 427 | ATA_ACPI_FILTER_FPDMA_AA = 1 << 4, /* FPDMA auto activate */ | ||
| 428 | |||
| 429 | ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER | | ||
| 430 | ATA_ACPI_FILTER_LOCK | | ||
| 431 | ATA_ACPI_FILTER_DIPM, | ||
| 421 | }; | 432 | }; |
| 422 | 433 | ||
| 423 | enum ata_xfer_mask { | 434 | enum ata_xfer_mask { |
| @@ -587,6 +598,7 @@ struct ata_device { | |||
| 587 | #ifdef CONFIG_ATA_ACPI | 598 | #ifdef CONFIG_ATA_ACPI |
| 588 | acpi_handle acpi_handle; | 599 | acpi_handle acpi_handle; |
| 589 | union acpi_object *gtf_cache; | 600 | union acpi_object *gtf_cache; |
| 601 | unsigned int gtf_filter; | ||
| 590 | #endif | 602 | #endif |
| 591 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ | 603 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ |
| 592 | u64 n_sectors; /* size of device, if ATA */ | 604 | u64 n_sectors; /* size of device, if ATA */ |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 3a9d36d1e92a..2e6d95f97419 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -442,6 +442,7 @@ enum perf_callchain_context { | |||
| 442 | #include <linux/hrtimer.h> | 442 | #include <linux/hrtimer.h> |
| 443 | #include <linux/fs.h> | 443 | #include <linux/fs.h> |
| 444 | #include <linux/pid_namespace.h> | 444 | #include <linux/pid_namespace.h> |
| 445 | #include <linux/workqueue.h> | ||
| 445 | #include <asm/atomic.h> | 446 | #include <asm/atomic.h> |
| 446 | 447 | ||
| 447 | #define PERF_MAX_STACK_DEPTH 255 | 448 | #define PERF_MAX_STACK_DEPTH 255 |
| @@ -513,6 +514,10 @@ struct file; | |||
| 513 | 514 | ||
| 514 | struct perf_mmap_data { | 515 | struct perf_mmap_data { |
| 515 | struct rcu_head rcu_head; | 516 | struct rcu_head rcu_head; |
| 517 | #ifdef CONFIG_PERF_USE_VMALLOC | ||
| 518 | struct work_struct work; | ||
| 519 | #endif | ||
| 520 | int data_order; | ||
| 516 | int nr_pages; /* nr of data pages */ | 521 | int nr_pages; /* nr of data pages */ |
| 517 | int writable; /* are we writable */ | 522 | int writable; /* are we writable */ |
| 518 | int nr_locked; /* nr pages mlocked */ | 523 | int nr_locked; /* nr pages mlocked */ |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 6fe0363724e9..3ebd0b7bcb08 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -77,7 +77,7 @@ extern int rcu_scheduler_active; | |||
| 77 | #error "Unknown RCU implementation specified to kernel configuration" | 77 | #error "Unknown RCU implementation specified to kernel configuration" |
| 78 | #endif | 78 | #endif |
| 79 | 79 | ||
| 80 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } | 80 | #define RCU_HEAD_INIT { .next = NULL, .func = NULL } |
| 81 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT | 81 | #define RCU_HEAD(head) struct rcu_head head = RCU_HEAD_INIT |
| 82 | #define INIT_RCU_HEAD(ptr) do { \ | 82 | #define INIT_RCU_HEAD(ptr) do { \ |
| 83 | (ptr)->next = NULL; (ptr)->func = NULL; \ | 83 | (ptr)->next = NULL; (ptr)->func = NULL; \ |
| @@ -129,12 +129,6 @@ static inline void rcu_read_lock(void) | |||
| 129 | rcu_read_acquire(); | 129 | rcu_read_acquire(); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | /** | ||
| 133 | * rcu_read_unlock - marks the end of an RCU read-side critical section. | ||
| 134 | * | ||
| 135 | * See rcu_read_lock() for more information. | ||
| 136 | */ | ||
| 137 | |||
| 138 | /* | 132 | /* |
| 139 | * So where is rcu_write_lock()? It does not exist, as there is no | 133 | * So where is rcu_write_lock()? It does not exist, as there is no |
| 140 | * way for writers to lock out RCU readers. This is a feature, not | 134 | * way for writers to lock out RCU readers. This is a feature, not |
| @@ -144,6 +138,12 @@ static inline void rcu_read_lock(void) | |||
| 144 | * used as well. RCU does not care how the writers keep out of each | 138 | * used as well. RCU does not care how the writers keep out of each |
| 145 | * others' way, as long as they do so. | 139 | * others' way, as long as they do so. |
| 146 | */ | 140 | */ |
| 141 | |||
| 142 | /** | ||
| 143 | * rcu_read_unlock - marks the end of an RCU read-side critical section. | ||
| 144 | * | ||
| 145 | * See rcu_read_lock() for more information. | ||
| 146 | */ | ||
| 147 | static inline void rcu_read_unlock(void) | 147 | static inline void rcu_read_unlock(void) |
| 148 | { | 148 | { |
| 149 | rcu_read_release(); | 149 | rcu_read_release(); |
| @@ -196,6 +196,8 @@ static inline void rcu_read_lock_sched(void) | |||
| 196 | __acquire(RCU_SCHED); | 196 | __acquire(RCU_SCHED); |
| 197 | rcu_read_acquire(); | 197 | rcu_read_acquire(); |
| 198 | } | 198 | } |
| 199 | |||
| 200 | /* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */ | ||
| 199 | static inline notrace void rcu_read_lock_sched_notrace(void) | 201 | static inline notrace void rcu_read_lock_sched_notrace(void) |
| 200 | { | 202 | { |
| 201 | preempt_disable_notrace(); | 203 | preempt_disable_notrace(); |
| @@ -213,6 +215,8 @@ static inline void rcu_read_unlock_sched(void) | |||
| 213 | __release(RCU_SCHED); | 215 | __release(RCU_SCHED); |
| 214 | preempt_enable(); | 216 | preempt_enable(); |
| 215 | } | 217 | } |
| 218 | |||
| 219 | /* Used by lockdep and tracing: cannot be traced, cannot call lockdep. */ | ||
| 216 | static inline notrace void rcu_read_unlock_sched_notrace(void) | 220 | static inline notrace void rcu_read_unlock_sched_notrace(void) |
| 217 | { | 221 | { |
| 218 | __release(RCU_SCHED); | 222 | __release(RCU_SCHED); |
diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index 37682770e9d2..46e9ab3ee6e1 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h | |||
| @@ -30,10 +30,14 @@ | |||
| 30 | #ifndef __LINUX_RCUTREE_H | 30 | #ifndef __LINUX_RCUTREE_H |
| 31 | #define __LINUX_RCUTREE_H | 31 | #define __LINUX_RCUTREE_H |
| 32 | 32 | ||
| 33 | struct notifier_block; | ||
| 34 | |||
| 33 | extern void rcu_sched_qs(int cpu); | 35 | extern void rcu_sched_qs(int cpu); |
| 34 | extern void rcu_bh_qs(int cpu); | 36 | extern void rcu_bh_qs(int cpu); |
| 35 | 37 | extern int rcu_cpu_notify(struct notifier_block *self, | |
| 38 | unsigned long action, void *hcpu); | ||
| 36 | extern int rcu_needs_cpu(int cpu); | 39 | extern int rcu_needs_cpu(int cpu); |
| 40 | extern int rcu_expedited_torture_stats(char *page); | ||
| 37 | 41 | ||
| 38 | #ifdef CONFIG_TREE_PREEMPT_RCU | 42 | #ifdef CONFIG_TREE_PREEMPT_RCU |
| 39 | 43 | ||
| @@ -85,16 +89,11 @@ static inline void synchronize_rcu_bh_expedited(void) | |||
| 85 | 89 | ||
| 86 | extern void __rcu_init(void); | 90 | extern void __rcu_init(void); |
| 87 | extern void rcu_check_callbacks(int cpu, int user); | 91 | extern void rcu_check_callbacks(int cpu, int user); |
| 88 | extern void rcu_restart_cpu(int cpu); | ||
| 89 | 92 | ||
| 90 | extern long rcu_batches_completed(void); | 93 | extern long rcu_batches_completed(void); |
| 91 | extern long rcu_batches_completed_bh(void); | 94 | extern long rcu_batches_completed_bh(void); |
| 92 | extern long rcu_batches_completed_sched(void); | 95 | extern long rcu_batches_completed_sched(void); |
| 93 | 96 | ||
| 94 | static inline void rcu_init_sched(void) | ||
| 95 | { | ||
| 96 | } | ||
| 97 | |||
| 98 | #ifdef CONFIG_NO_HZ | 97 | #ifdef CONFIG_NO_HZ |
| 99 | void rcu_enter_nohz(void); | 98 | void rcu_enter_nohz(void); |
| 100 | void rcu_exit_nohz(void); | 99 | void rcu_exit_nohz(void); |
| @@ -107,7 +106,7 @@ static inline void rcu_exit_nohz(void) | |||
| 107 | } | 106 | } |
| 108 | #endif /* CONFIG_NO_HZ */ | 107 | #endif /* CONFIG_NO_HZ */ |
| 109 | 108 | ||
| 110 | /* A context switch is a grace period for rcutree. */ | 109 | /* A context switch is a grace period for RCU-sched and RCU-bh. */ |
| 111 | static inline int rcu_blocking_is_gp(void) | 110 | static inline int rcu_blocking_is_gp(void) |
| 112 | { | 111 | { |
| 113 | return num_online_cpus() == 1; | 112 | return num_online_cpus() == 1; |
diff --git a/include/linux/socket.h b/include/linux/socket.h index 3b461dffe244..3273a0c5043b 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -16,7 +16,7 @@ struct __kernel_sockaddr_storage { | |||
| 16 | /* _SS_MAXSIZE value minus size of ss_family */ | 16 | /* _SS_MAXSIZE value minus size of ss_family */ |
| 17 | } __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */ | 17 | } __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */ |
| 18 | 18 | ||
| 19 | #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) | 19 | #ifdef __KERNEL__ |
| 20 | 20 | ||
| 21 | #include <asm/socket.h> /* arch-dependent defines */ | 21 | #include <asm/socket.h> /* arch-dependent defines */ |
| 22 | #include <linux/sockios.h> /* the SIOCxxx I/O controls */ | 22 | #include <linux/sockios.h> /* the SIOCxxx I/O controls */ |
| @@ -101,21 +101,6 @@ struct cmsghdr { | |||
| 101 | ((char *)(cmsg) - (char *)(mhdr)->msg_control))) | 101 | ((char *)(cmsg) - (char *)(mhdr)->msg_control))) |
| 102 | 102 | ||
| 103 | /* | 103 | /* |
| 104 | * This mess will go away with glibc | ||
| 105 | */ | ||
| 106 | |||
| 107 | #ifdef __KERNEL__ | ||
| 108 | #define __KINLINE static inline | ||
| 109 | #elif defined(__GNUC__) | ||
| 110 | #define __KINLINE static __inline__ | ||
| 111 | #elif defined(__cplusplus) | ||
| 112 | #define __KINLINE static inline | ||
| 113 | #else | ||
| 114 | #define __KINLINE static | ||
| 115 | #endif | ||
| 116 | |||
| 117 | |||
| 118 | /* | ||
| 119 | * Get the next cmsg header | 104 | * Get the next cmsg header |
| 120 | * | 105 | * |
| 121 | * PLEASE, do not touch this function. If you think, that it is | 106 | * PLEASE, do not touch this function. If you think, that it is |
| @@ -128,7 +113,7 @@ struct cmsghdr { | |||
| 128 | * ancillary object DATA. --ANK (980731) | 113 | * ancillary object DATA. --ANK (980731) |
| 129 | */ | 114 | */ |
| 130 | 115 | ||
| 131 | __KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size, | 116 | static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size, |
| 132 | struct cmsghdr *__cmsg) | 117 | struct cmsghdr *__cmsg) |
| 133 | { | 118 | { |
| 134 | struct cmsghdr * __ptr; | 119 | struct cmsghdr * __ptr; |
| @@ -140,7 +125,7 @@ __KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size, | |||
| 140 | return __ptr; | 125 | return __ptr; |
| 141 | } | 126 | } |
| 142 | 127 | ||
| 143 | __KINLINE struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg) | 128 | static inline struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg) |
| 144 | { | 129 | { |
| 145 | return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg); | 130 | return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg); |
| 146 | } | 131 | } |
diff --git a/init/Kconfig b/init/Kconfig index c7bac39d6c61..09c5c6431f42 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
| @@ -921,6 +921,11 @@ config HAVE_PERF_EVENTS | |||
| 921 | help | 921 | help |
| 922 | See tools/perf/design.txt for details. | 922 | See tools/perf/design.txt for details. |
| 923 | 923 | ||
| 924 | config PERF_USE_VMALLOC | ||
| 925 | bool | ||
| 926 | help | ||
| 927 | See tools/perf/design.txt for details | ||
| 928 | |||
| 924 | menu "Kernel Performance Events And Counters" | 929 | menu "Kernel Performance Events And Counters" |
| 925 | 930 | ||
| 926 | config PERF_EVENTS | 931 | config PERF_EVENTS |
| @@ -976,6 +981,19 @@ config PERF_COUNTERS | |||
| 976 | 981 | ||
| 977 | Say N if unsure. | 982 | Say N if unsure. |
| 978 | 983 | ||
| 984 | config DEBUG_PERF_USE_VMALLOC | ||
| 985 | default n | ||
| 986 | bool "Debug: use vmalloc to back perf mmap() buffers" | ||
| 987 | depends on PERF_EVENTS && DEBUG_KERNEL | ||
| 988 | select PERF_USE_VMALLOC | ||
| 989 | help | ||
| 990 | Use vmalloc memory to back perf mmap() buffers. | ||
| 991 | |||
| 992 | Mostly useful for debugging the vmalloc code on platforms | ||
| 993 | that don't require it. | ||
| 994 | |||
| 995 | Say N if unsure. | ||
| 996 | |||
| 979 | endmenu | 997 | endmenu |
| 980 | 998 | ||
| 981 | config VM_EVENT_COUNTERS | 999 | config VM_EVENT_COUNTERS |
diff --git a/init/main.c b/init/main.c index 7449819a4805..5988debfc505 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -778,7 +778,6 @@ static void __init do_initcalls(void) | |||
| 778 | */ | 778 | */ |
| 779 | static void __init do_basic_setup(void) | 779 | static void __init do_basic_setup(void) |
| 780 | { | 780 | { |
| 781 | rcu_init_sched(); /* needed by module_init stage. */ | ||
| 782 | init_workqueues(); | 781 | init_workqueues(); |
| 783 | cpuset_init_smp(); | 782 | cpuset_init_smp(); |
| 784 | usermodehelper_init(); | 783 | usermodehelper_init(); |
diff --git a/kernel/exit.c b/kernel/exit.c index 5859f598c951..e61891f80123 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -991,8 +991,6 @@ NORET_TYPE void do_exit(long code) | |||
| 991 | tsk->mempolicy = NULL; | 991 | tsk->mempolicy = NULL; |
| 992 | #endif | 992 | #endif |
| 993 | #ifdef CONFIG_FUTEX | 993 | #ifdef CONFIG_FUTEX |
| 994 | if (unlikely(!list_empty(&tsk->pi_state_list))) | ||
| 995 | exit_pi_state_list(tsk); | ||
| 996 | if (unlikely(current->pi_state_cache)) | 994 | if (unlikely(current->pi_state_cache)) |
| 997 | kfree(current->pi_state_cache); | 995 | kfree(current->pi_state_cache); |
| 998 | #endif | 996 | #endif |
diff --git a/kernel/fork.c b/kernel/fork.c index 266c6af6ef1b..4c20fff8c13a 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -570,12 +570,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm) | |||
| 570 | 570 | ||
| 571 | /* Get rid of any futexes when releasing the mm */ | 571 | /* Get rid of any futexes when releasing the mm */ |
| 572 | #ifdef CONFIG_FUTEX | 572 | #ifdef CONFIG_FUTEX |
| 573 | if (unlikely(tsk->robust_list)) | 573 | if (unlikely(tsk->robust_list)) { |
| 574 | exit_robust_list(tsk); | 574 | exit_robust_list(tsk); |
| 575 | tsk->robust_list = NULL; | ||
| 576 | } | ||
| 575 | #ifdef CONFIG_COMPAT | 577 | #ifdef CONFIG_COMPAT |
| 576 | if (unlikely(tsk->compat_robust_list)) | 578 | if (unlikely(tsk->compat_robust_list)) { |
| 577 | compat_exit_robust_list(tsk); | 579 | compat_exit_robust_list(tsk); |
| 580 | tsk->compat_robust_list = NULL; | ||
| 581 | } | ||
| 578 | #endif | 582 | #endif |
| 583 | if (unlikely(!list_empty(&tsk->pi_state_list))) | ||
| 584 | exit_pi_state_list(tsk); | ||
| 579 | #endif | 585 | #endif |
| 580 | 586 | ||
| 581 | /* Get rid of any cached register state */ | 587 | /* Get rid of any cached register state */ |
diff --git a/kernel/futex.c b/kernel/futex.c index b911adceb2c4..4949d336d88d 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -916,8 +916,8 @@ retry: | |||
| 916 | hb1 = hash_futex(&key1); | 916 | hb1 = hash_futex(&key1); |
| 917 | hb2 = hash_futex(&key2); | 917 | hb2 = hash_futex(&key2); |
| 918 | 918 | ||
| 919 | double_lock_hb(hb1, hb2); | ||
| 920 | retry_private: | 919 | retry_private: |
| 920 | double_lock_hb(hb1, hb2); | ||
| 921 | op_ret = futex_atomic_op_inuser(op, uaddr2); | 921 | op_ret = futex_atomic_op_inuser(op, uaddr2); |
| 922 | if (unlikely(op_ret < 0)) { | 922 | if (unlikely(op_ret < 0)) { |
| 923 | 923 | ||
| @@ -2117,7 +2117,6 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb, | |||
| 2117 | * Unqueue the futex_q and determine which it was. | 2117 | * Unqueue the futex_q and determine which it was. |
| 2118 | */ | 2118 | */ |
| 2119 | plist_del(&q->list, &q->list.plist); | 2119 | plist_del(&q->list, &q->list.plist); |
| 2120 | drop_futex_key_refs(&q->key); | ||
| 2121 | 2120 | ||
| 2122 | if (timeout && !timeout->task) | 2121 | if (timeout && !timeout->task) |
| 2123 | ret = -ETIMEDOUT; | 2122 | ret = -ETIMEDOUT; |
diff --git a/kernel/panic.c b/kernel/panic.c index bcdef26e3332..96b45d0b4ba5 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -90,6 +90,8 @@ NORET_TYPE void panic(const char * fmt, ...) | |||
| 90 | 90 | ||
| 91 | atomic_notifier_call_chain(&panic_notifier_list, 0, buf); | 91 | atomic_notifier_call_chain(&panic_notifier_list, 0, buf); |
| 92 | 92 | ||
| 93 | bust_spinlocks(0); | ||
| 94 | |||
| 93 | if (!panic_blink) | 95 | if (!panic_blink) |
| 94 | panic_blink = no_blink; | 96 | panic_blink = no_blink; |
| 95 | 97 | ||
| @@ -136,7 +138,6 @@ NORET_TYPE void panic(const char * fmt, ...) | |||
| 136 | mdelay(1); | 138 | mdelay(1); |
| 137 | i++; | 139 | i++; |
| 138 | } | 140 | } |
| 139 | bust_spinlocks(0); | ||
| 140 | } | 141 | } |
| 141 | 142 | ||
| 142 | EXPORT_SYMBOL(panic); | 143 | EXPORT_SYMBOL(panic); |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index e491fb087939..9d0b5c665883 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/percpu.h> | 20 | #include <linux/percpu.h> |
| 21 | #include <linux/ptrace.h> | 21 | #include <linux/ptrace.h> |
| 22 | #include <linux/vmstat.h> | 22 | #include <linux/vmstat.h> |
| 23 | #include <linux/vmalloc.h> | ||
| 23 | #include <linux/hardirq.h> | 24 | #include <linux/hardirq.h> |
| 24 | #include <linux/rculist.h> | 25 | #include <linux/rculist.h> |
| 25 | #include <linux/uaccess.h> | 26 | #include <linux/uaccess.h> |
| @@ -2091,49 +2092,31 @@ unlock: | |||
| 2091 | rcu_read_unlock(); | 2092 | rcu_read_unlock(); |
| 2092 | } | 2093 | } |
| 2093 | 2094 | ||
| 2094 | static int perf_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 2095 | static unsigned long perf_data_size(struct perf_mmap_data *data) |
| 2095 | { | 2096 | { |
| 2096 | struct perf_event *event = vma->vm_file->private_data; | 2097 | return data->nr_pages << (PAGE_SHIFT + data->data_order); |
| 2097 | struct perf_mmap_data *data; | 2098 | } |
| 2098 | int ret = VM_FAULT_SIGBUS; | ||
| 2099 | |||
| 2100 | if (vmf->flags & FAULT_FLAG_MKWRITE) { | ||
| 2101 | if (vmf->pgoff == 0) | ||
| 2102 | ret = 0; | ||
| 2103 | return ret; | ||
| 2104 | } | ||
| 2105 | |||
| 2106 | rcu_read_lock(); | ||
| 2107 | data = rcu_dereference(event->data); | ||
| 2108 | if (!data) | ||
| 2109 | goto unlock; | ||
| 2110 | |||
| 2111 | if (vmf->pgoff == 0) { | ||
| 2112 | vmf->page = virt_to_page(data->user_page); | ||
| 2113 | } else { | ||
| 2114 | int nr = vmf->pgoff - 1; | ||
| 2115 | |||
| 2116 | if ((unsigned)nr > data->nr_pages) | ||
| 2117 | goto unlock; | ||
| 2118 | 2099 | ||
| 2119 | if (vmf->flags & FAULT_FLAG_WRITE) | 2100 | #ifndef CONFIG_PERF_USE_VMALLOC |
| 2120 | goto unlock; | ||
| 2121 | 2101 | ||
| 2122 | vmf->page = virt_to_page(data->data_pages[nr]); | 2102 | /* |
| 2123 | } | 2103 | * Back perf_mmap() with regular GFP_KERNEL-0 pages. |
| 2104 | */ | ||
| 2124 | 2105 | ||
| 2125 | get_page(vmf->page); | 2106 | static struct page * |
| 2126 | vmf->page->mapping = vma->vm_file->f_mapping; | 2107 | perf_mmap_to_page(struct perf_mmap_data *data, unsigned long pgoff) |
| 2127 | vmf->page->index = vmf->pgoff; | 2108 | { |
| 2109 | if (pgoff > data->nr_pages) | ||
| 2110 | return NULL; | ||
| 2128 | 2111 | ||
| 2129 | ret = 0; | 2112 | if (pgoff == 0) |
| 2130 | unlock: | 2113 | return virt_to_page(data->user_page); |
| 2131 | rcu_read_unlock(); | ||
| 2132 | 2114 | ||
| 2133 | return ret; | 2115 | return virt_to_page(data->data_pages[pgoff - 1]); |
| 2134 | } | 2116 | } |
| 2135 | 2117 | ||
| 2136 | static int perf_mmap_data_alloc(struct perf_event *event, int nr_pages) | 2118 | static struct perf_mmap_data * |
| 2119 | perf_mmap_data_alloc(struct perf_event *event, int nr_pages) | ||
| 2137 | { | 2120 | { |
| 2138 | struct perf_mmap_data *data; | 2121 | struct perf_mmap_data *data; |
| 2139 | unsigned long size; | 2122 | unsigned long size; |
| @@ -2158,19 +2141,10 @@ static int perf_mmap_data_alloc(struct perf_event *event, int nr_pages) | |||
| 2158 | goto fail_data_pages; | 2141 | goto fail_data_pages; |
| 2159 | } | 2142 | } |
| 2160 | 2143 | ||
| 2144 | data->data_order = 0; | ||
| 2161 | data->nr_pages = nr_pages; | 2145 | data->nr_pages = nr_pages; |
| 2162 | atomic_set(&data->lock, -1); | ||
| 2163 | |||
| 2164 | if (event->attr.watermark) { | ||
| 2165 | data->watermark = min_t(long, PAGE_SIZE * nr_pages, | ||
| 2166 | event->attr.wakeup_watermark); | ||
| 2167 | } | ||
| 2168 | if (!data->watermark) | ||
| 2169 | data->watermark = max(PAGE_SIZE, PAGE_SIZE * nr_pages / 4); | ||
| 2170 | 2146 | ||
| 2171 | rcu_assign_pointer(event->data, data); | 2147 | return data; |
| 2172 | |||
| 2173 | return 0; | ||
| 2174 | 2148 | ||
| 2175 | fail_data_pages: | 2149 | fail_data_pages: |
| 2176 | for (i--; i >= 0; i--) | 2150 | for (i--; i >= 0; i--) |
| @@ -2182,7 +2156,7 @@ fail_user_page: | |||
| 2182 | kfree(data); | 2156 | kfree(data); |
| 2183 | 2157 | ||
| 2184 | fail: | 2158 | fail: |
| 2185 | return -ENOMEM; | 2159 | return NULL; |
| 2186 | } | 2160 | } |
| 2187 | 2161 | ||
| 2188 | static void perf_mmap_free_page(unsigned long addr) | 2162 | static void perf_mmap_free_page(unsigned long addr) |
| @@ -2193,28 +2167,169 @@ static void perf_mmap_free_page(unsigned long addr) | |||
| 2193 | __free_page(page); | 2167 | __free_page(page); |
| 2194 | } | 2168 | } |
| 2195 | 2169 | ||
| 2196 | static void __perf_mmap_data_free(struct rcu_head *rcu_head) | 2170 | static void perf_mmap_data_free(struct perf_mmap_data *data) |
| 2197 | { | 2171 | { |
| 2198 | struct perf_mmap_data *data; | ||
| 2199 | int i; | 2172 | int i; |
| 2200 | 2173 | ||
| 2201 | data = container_of(rcu_head, struct perf_mmap_data, rcu_head); | ||
| 2202 | |||
| 2203 | perf_mmap_free_page((unsigned long)data->user_page); | 2174 | perf_mmap_free_page((unsigned long)data->user_page); |
| 2204 | for (i = 0; i < data->nr_pages; i++) | 2175 | for (i = 0; i < data->nr_pages; i++) |
| 2205 | perf_mmap_free_page((unsigned long)data->data_pages[i]); | 2176 | perf_mmap_free_page((unsigned long)data->data_pages[i]); |
| 2177 | } | ||
| 2178 | |||
| 2179 | #else | ||
| 2180 | |||
| 2181 | /* | ||
| 2182 | * Back perf_mmap() with vmalloc memory. | ||
| 2183 | * | ||
| 2184 | * Required for architectures that have d-cache aliasing issues. | ||
| 2185 | */ | ||
| 2186 | |||
| 2187 | static struct page * | ||
| 2188 | perf_mmap_to_page(struct perf_mmap_data *data, unsigned long pgoff) | ||
| 2189 | { | ||
| 2190 | if (pgoff > (1UL << data->data_order)) | ||
| 2191 | return NULL; | ||
| 2192 | |||
| 2193 | return vmalloc_to_page((void *)data->user_page + pgoff * PAGE_SIZE); | ||
| 2194 | } | ||
| 2195 | |||
| 2196 | static void perf_mmap_unmark_page(void *addr) | ||
| 2197 | { | ||
| 2198 | struct page *page = vmalloc_to_page(addr); | ||
| 2199 | |||
| 2200 | page->mapping = NULL; | ||
| 2201 | } | ||
| 2202 | |||
| 2203 | static void perf_mmap_data_free_work(struct work_struct *work) | ||
| 2204 | { | ||
| 2205 | struct perf_mmap_data *data; | ||
| 2206 | void *base; | ||
| 2207 | int i, nr; | ||
| 2208 | |||
| 2209 | data = container_of(work, struct perf_mmap_data, work); | ||
| 2210 | nr = 1 << data->data_order; | ||
| 2211 | |||
| 2212 | base = data->user_page; | ||
| 2213 | for (i = 0; i < nr + 1; i++) | ||
| 2214 | perf_mmap_unmark_page(base + (i * PAGE_SIZE)); | ||
| 2215 | |||
| 2216 | vfree(base); | ||
| 2217 | } | ||
| 2218 | |||
| 2219 | static void perf_mmap_data_free(struct perf_mmap_data *data) | ||
| 2220 | { | ||
| 2221 | schedule_work(&data->work); | ||
| 2222 | } | ||
| 2223 | |||
| 2224 | static struct perf_mmap_data * | ||
| 2225 | perf_mmap_data_alloc(struct perf_event *event, int nr_pages) | ||
| 2226 | { | ||
| 2227 | struct perf_mmap_data *data; | ||
| 2228 | unsigned long size; | ||
| 2229 | void *all_buf; | ||
| 2206 | 2230 | ||
| 2231 | WARN_ON(atomic_read(&event->mmap_count)); | ||
| 2232 | |||
| 2233 | size = sizeof(struct perf_mmap_data); | ||
| 2234 | size += sizeof(void *); | ||
| 2235 | |||
| 2236 | data = kzalloc(size, GFP_KERNEL); | ||
| 2237 | if (!data) | ||
| 2238 | goto fail; | ||
| 2239 | |||
| 2240 | INIT_WORK(&data->work, perf_mmap_data_free_work); | ||
| 2241 | |||
| 2242 | all_buf = vmalloc_user((nr_pages + 1) * PAGE_SIZE); | ||
| 2243 | if (!all_buf) | ||
| 2244 | goto fail_all_buf; | ||
| 2245 | |||
| 2246 | data->user_page = all_buf; | ||
| 2247 | data->data_pages[0] = all_buf + PAGE_SIZE; | ||
| 2248 | data->data_order = ilog2(nr_pages); | ||
| 2249 | data->nr_pages = 1; | ||
| 2250 | |||
| 2251 | return data; | ||
| 2252 | |||
| 2253 | fail_all_buf: | ||
| 2254 | kfree(data); | ||
| 2255 | |||
| 2256 | fail: | ||
| 2257 | return NULL; | ||
| 2258 | } | ||
| 2259 | |||
| 2260 | #endif | ||
| 2261 | |||
| 2262 | static int perf_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
| 2263 | { | ||
| 2264 | struct perf_event *event = vma->vm_file->private_data; | ||
| 2265 | struct perf_mmap_data *data; | ||
| 2266 | int ret = VM_FAULT_SIGBUS; | ||
| 2267 | |||
| 2268 | if (vmf->flags & FAULT_FLAG_MKWRITE) { | ||
| 2269 | if (vmf->pgoff == 0) | ||
| 2270 | ret = 0; | ||
| 2271 | return ret; | ||
| 2272 | } | ||
| 2273 | |||
| 2274 | rcu_read_lock(); | ||
| 2275 | data = rcu_dereference(event->data); | ||
| 2276 | if (!data) | ||
| 2277 | goto unlock; | ||
| 2278 | |||
| 2279 | if (vmf->pgoff && (vmf->flags & FAULT_FLAG_WRITE)) | ||
| 2280 | goto unlock; | ||
| 2281 | |||
| 2282 | vmf->page = perf_mmap_to_page(data, vmf->pgoff); | ||
| 2283 | if (!vmf->page) | ||
| 2284 | goto unlock; | ||
| 2285 | |||
| 2286 | get_page(vmf->page); | ||
| 2287 | vmf->page->mapping = vma->vm_file->f_mapping; | ||
| 2288 | vmf->page->index = vmf->pgoff; | ||
| 2289 | |||
| 2290 | ret = 0; | ||
| 2291 | unlock: | ||
| 2292 | rcu_read_unlock(); | ||
| 2293 | |||
| 2294 | return ret; | ||
| 2295 | } | ||
| 2296 | |||
| 2297 | static void | ||
| 2298 | perf_mmap_data_init(struct perf_event *event, struct perf_mmap_data *data) | ||
| 2299 | { | ||
| 2300 | long max_size = perf_data_size(data); | ||
| 2301 | |||
| 2302 | atomic_set(&data->lock, -1); | ||
| 2303 | |||
| 2304 | if (event->attr.watermark) { | ||
| 2305 | data->watermark = min_t(long, max_size, | ||
| 2306 | event->attr.wakeup_watermark); | ||
| 2307 | } | ||
| 2308 | |||
| 2309 | if (!data->watermark) | ||
| 2310 | data->watermark = max_t(long, PAGE_SIZE, max_size / 2); | ||
| 2311 | |||
| 2312 | |||
| 2313 | rcu_assign_pointer(event->data, data); | ||
| 2314 | } | ||
| 2315 | |||
| 2316 | static void perf_mmap_data_free_rcu(struct rcu_head *rcu_head) | ||
| 2317 | { | ||
| 2318 | struct perf_mmap_data *data; | ||
| 2319 | |||
| 2320 | data = container_of(rcu_head, struct perf_mmap_data, rcu_head); | ||
| 2321 | perf_mmap_data_free(data); | ||
| 2207 | kfree(data); | 2322 | kfree(data); |
| 2208 | } | 2323 | } |
| 2209 | 2324 | ||
| 2210 | static void perf_mmap_data_free(struct perf_event *event) | 2325 | static void perf_mmap_data_release(struct perf_event *event) |
| 2211 | { | 2326 | { |
| 2212 | struct perf_mmap_data *data = event->data; | 2327 | struct perf_mmap_data *data = event->data; |
| 2213 | 2328 | ||
| 2214 | WARN_ON(atomic_read(&event->mmap_count)); | 2329 | WARN_ON(atomic_read(&event->mmap_count)); |
| 2215 | 2330 | ||
| 2216 | rcu_assign_pointer(event->data, NULL); | 2331 | rcu_assign_pointer(event->data, NULL); |
| 2217 | call_rcu(&data->rcu_head, __perf_mmap_data_free); | 2332 | call_rcu(&data->rcu_head, perf_mmap_data_free_rcu); |
| 2218 | } | 2333 | } |
| 2219 | 2334 | ||
| 2220 | static void perf_mmap_open(struct vm_area_struct *vma) | 2335 | static void perf_mmap_open(struct vm_area_struct *vma) |
| @@ -2230,11 +2345,12 @@ static void perf_mmap_close(struct vm_area_struct *vma) | |||
| 2230 | 2345 | ||
| 2231 | WARN_ON_ONCE(event->ctx->parent_ctx); | 2346 | WARN_ON_ONCE(event->ctx->parent_ctx); |
| 2232 | if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) { | 2347 | if (atomic_dec_and_mutex_lock(&event->mmap_count, &event->mmap_mutex)) { |
| 2348 | unsigned long size = perf_data_size(event->data); | ||
| 2233 | struct user_struct *user = current_user(); | 2349 | struct user_struct *user = current_user(); |
| 2234 | 2350 | ||
| 2235 | atomic_long_sub(event->data->nr_pages + 1, &user->locked_vm); | 2351 | atomic_long_sub((size >> PAGE_SHIFT) + 1, &user->locked_vm); |
| 2236 | vma->vm_mm->locked_vm -= event->data->nr_locked; | 2352 | vma->vm_mm->locked_vm -= event->data->nr_locked; |
| 2237 | perf_mmap_data_free(event); | 2353 | perf_mmap_data_release(event); |
| 2238 | mutex_unlock(&event->mmap_mutex); | 2354 | mutex_unlock(&event->mmap_mutex); |
| 2239 | } | 2355 | } |
| 2240 | } | 2356 | } |
| @@ -2252,6 +2368,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 2252 | unsigned long user_locked, user_lock_limit; | 2368 | unsigned long user_locked, user_lock_limit; |
| 2253 | struct user_struct *user = current_user(); | 2369 | struct user_struct *user = current_user(); |
| 2254 | unsigned long locked, lock_limit; | 2370 | unsigned long locked, lock_limit; |
| 2371 | struct perf_mmap_data *data; | ||
| 2255 | unsigned long vma_size; | 2372 | unsigned long vma_size; |
| 2256 | unsigned long nr_pages; | 2373 | unsigned long nr_pages; |
| 2257 | long user_extra, extra; | 2374 | long user_extra, extra; |
| @@ -2314,10 +2431,15 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 2314 | } | 2431 | } |
| 2315 | 2432 | ||
| 2316 | WARN_ON(event->data); | 2433 | WARN_ON(event->data); |
| 2317 | ret = perf_mmap_data_alloc(event, nr_pages); | 2434 | |
| 2318 | if (ret) | 2435 | data = perf_mmap_data_alloc(event, nr_pages); |
| 2436 | ret = -ENOMEM; | ||
| 2437 | if (!data) | ||
| 2319 | goto unlock; | 2438 | goto unlock; |
| 2320 | 2439 | ||
| 2440 | ret = 0; | ||
| 2441 | perf_mmap_data_init(event, data); | ||
| 2442 | |||
| 2321 | atomic_set(&event->mmap_count, 1); | 2443 | atomic_set(&event->mmap_count, 1); |
| 2322 | atomic_long_add(user_extra, &user->locked_vm); | 2444 | atomic_long_add(user_extra, &user->locked_vm); |
| 2323 | vma->vm_mm->locked_vm += extra; | 2445 | vma->vm_mm->locked_vm += extra; |
| @@ -2505,7 +2627,7 @@ static bool perf_output_space(struct perf_mmap_data *data, unsigned long tail, | |||
| 2505 | if (!data->writable) | 2627 | if (!data->writable) |
| 2506 | return true; | 2628 | return true; |
| 2507 | 2629 | ||
| 2508 | mask = (data->nr_pages << PAGE_SHIFT) - 1; | 2630 | mask = perf_data_size(data) - 1; |
| 2509 | 2631 | ||
| 2510 | offset = (offset - tail) & mask; | 2632 | offset = (offset - tail) & mask; |
| 2511 | head = (head - tail) & mask; | 2633 | head = (head - tail) & mask; |
| @@ -2610,7 +2732,7 @@ void perf_output_copy(struct perf_output_handle *handle, | |||
| 2610 | const void *buf, unsigned int len) | 2732 | const void *buf, unsigned int len) |
| 2611 | { | 2733 | { |
| 2612 | unsigned int pages_mask; | 2734 | unsigned int pages_mask; |
| 2613 | unsigned int offset; | 2735 | unsigned long offset; |
| 2614 | unsigned int size; | 2736 | unsigned int size; |
| 2615 | void **pages; | 2737 | void **pages; |
| 2616 | 2738 | ||
| @@ -2619,12 +2741,14 @@ void perf_output_copy(struct perf_output_handle *handle, | |||
| 2619 | pages = handle->data->data_pages; | 2741 | pages = handle->data->data_pages; |
| 2620 | 2742 | ||
| 2621 | do { | 2743 | do { |
| 2622 | unsigned int page_offset; | 2744 | unsigned long page_offset; |
| 2745 | unsigned long page_size; | ||
| 2623 | int nr; | 2746 | int nr; |
| 2624 | 2747 | ||
| 2625 | nr = (offset >> PAGE_SHIFT) & pages_mask; | 2748 | nr = (offset >> PAGE_SHIFT) & pages_mask; |
| 2626 | page_offset = offset & (PAGE_SIZE - 1); | 2749 | page_size = 1UL << (handle->data->data_order + PAGE_SHIFT); |
| 2627 | size = min_t(unsigned int, PAGE_SIZE - page_offset, len); | 2750 | page_offset = offset & (page_size - 1); |
| 2751 | size = min_t(unsigned int, page_size - page_offset, len); | ||
| 2628 | 2752 | ||
| 2629 | memcpy(pages[nr] + page_offset, buf, size); | 2753 | memcpy(pages[nr] + page_offset, buf, size); |
| 2630 | 2754 | ||
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index 37ac45483082..400183346ad2 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
| @@ -46,22 +46,15 @@ | |||
| 46 | #include <linux/module.h> | 46 | #include <linux/module.h> |
| 47 | #include <linux/kernel_stat.h> | 47 | #include <linux/kernel_stat.h> |
| 48 | 48 | ||
| 49 | enum rcu_barrier { | 49 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 50 | RCU_BARRIER_STD, | 50 | static struct lock_class_key rcu_lock_key; |
| 51 | RCU_BARRIER_BH, | 51 | struct lockdep_map rcu_lock_map = |
| 52 | RCU_BARRIER_SCHED, | 52 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key); |
| 53 | }; | 53 | EXPORT_SYMBOL_GPL(rcu_lock_map); |
| 54 | #endif | ||
| 54 | 55 | ||
| 55 | static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; | ||
| 56 | static atomic_t rcu_barrier_cpu_count; | ||
| 57 | static DEFINE_MUTEX(rcu_barrier_mutex); | ||
| 58 | static struct completion rcu_barrier_completion; | ||
| 59 | int rcu_scheduler_active __read_mostly; | 56 | int rcu_scheduler_active __read_mostly; |
| 60 | 57 | ||
| 61 | static atomic_t rcu_migrate_type_count = ATOMIC_INIT(0); | ||
| 62 | static struct rcu_head rcu_migrate_head[3]; | ||
| 63 | static DECLARE_WAIT_QUEUE_HEAD(rcu_migrate_wq); | ||
| 64 | |||
| 65 | /* | 58 | /* |
| 66 | * Awaken the corresponding synchronize_rcu() instance now that a | 59 | * Awaken the corresponding synchronize_rcu() instance now that a |
| 67 | * grace period has elapsed. | 60 | * grace period has elapsed. |
| @@ -164,129 +157,10 @@ void synchronize_rcu_bh(void) | |||
| 164 | } | 157 | } |
| 165 | EXPORT_SYMBOL_GPL(synchronize_rcu_bh); | 158 | EXPORT_SYMBOL_GPL(synchronize_rcu_bh); |
| 166 | 159 | ||
| 167 | static void rcu_barrier_callback(struct rcu_head *notused) | ||
| 168 | { | ||
| 169 | if (atomic_dec_and_test(&rcu_barrier_cpu_count)) | ||
| 170 | complete(&rcu_barrier_completion); | ||
| 171 | } | ||
| 172 | |||
| 173 | /* | ||
| 174 | * Called with preemption disabled, and from cross-cpu IRQ context. | ||
| 175 | */ | ||
| 176 | static void rcu_barrier_func(void *type) | ||
| 177 | { | ||
| 178 | int cpu = smp_processor_id(); | ||
| 179 | struct rcu_head *head = &per_cpu(rcu_barrier_head, cpu); | ||
| 180 | |||
| 181 | atomic_inc(&rcu_barrier_cpu_count); | ||
| 182 | switch ((enum rcu_barrier)type) { | ||
| 183 | case RCU_BARRIER_STD: | ||
| 184 | call_rcu(head, rcu_barrier_callback); | ||
| 185 | break; | ||
| 186 | case RCU_BARRIER_BH: | ||
| 187 | call_rcu_bh(head, rcu_barrier_callback); | ||
| 188 | break; | ||
| 189 | case RCU_BARRIER_SCHED: | ||
| 190 | call_rcu_sched(head, rcu_barrier_callback); | ||
| 191 | break; | ||
| 192 | } | ||
| 193 | } | ||
| 194 | |||
| 195 | static inline void wait_migrated_callbacks(void) | ||
| 196 | { | ||
| 197 | wait_event(rcu_migrate_wq, !atomic_read(&rcu_migrate_type_count)); | ||
| 198 | smp_mb(); /* In case we didn't sleep. */ | ||
| 199 | } | ||
| 200 | |||
| 201 | /* | ||
| 202 | * Orchestrate the specified type of RCU barrier, waiting for all | ||
| 203 | * RCU callbacks of the specified type to complete. | ||
| 204 | */ | ||
| 205 | static void _rcu_barrier(enum rcu_barrier type) | ||
| 206 | { | ||
| 207 | BUG_ON(in_interrupt()); | ||
| 208 | /* Take cpucontrol mutex to protect against CPU hotplug */ | ||
| 209 | mutex_lock(&rcu_barrier_mutex); | ||
| 210 | init_completion(&rcu_barrier_completion); | ||
| 211 | /* | ||
| 212 | * Initialize rcu_barrier_cpu_count to 1, then invoke | ||
| 213 | * rcu_barrier_func() on each CPU, so that each CPU also has | ||
| 214 | * incremented rcu_barrier_cpu_count. Only then is it safe to | ||
| 215 | * decrement rcu_barrier_cpu_count -- otherwise the first CPU | ||
| 216 | * might complete its grace period before all of the other CPUs | ||
| 217 | * did their increment, causing this function to return too | ||
| 218 | * early. | ||
| 219 | */ | ||
| 220 | atomic_set(&rcu_barrier_cpu_count, 1); | ||
| 221 | on_each_cpu(rcu_barrier_func, (void *)type, 1); | ||
| 222 | if (atomic_dec_and_test(&rcu_barrier_cpu_count)) | ||
| 223 | complete(&rcu_barrier_completion); | ||
| 224 | wait_for_completion(&rcu_barrier_completion); | ||
| 225 | mutex_unlock(&rcu_barrier_mutex); | ||
| 226 | wait_migrated_callbacks(); | ||
| 227 | } | ||
| 228 | |||
| 229 | /** | ||
| 230 | * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete. | ||
| 231 | */ | ||
| 232 | void rcu_barrier(void) | ||
| 233 | { | ||
| 234 | _rcu_barrier(RCU_BARRIER_STD); | ||
| 235 | } | ||
| 236 | EXPORT_SYMBOL_GPL(rcu_barrier); | ||
| 237 | |||
| 238 | /** | ||
| 239 | * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. | ||
| 240 | */ | ||
| 241 | void rcu_barrier_bh(void) | ||
| 242 | { | ||
| 243 | _rcu_barrier(RCU_BARRIER_BH); | ||
| 244 | } | ||
| 245 | EXPORT_SYMBOL_GPL(rcu_barrier_bh); | ||
| 246 | |||
| 247 | /** | ||
| 248 | * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks. | ||
| 249 | */ | ||
| 250 | void rcu_barrier_sched(void) | ||
| 251 | { | ||
| 252 | _rcu_barrier(RCU_BARRIER_SCHED); | ||
| 253 | } | ||
| 254 | EXPORT_SYMBOL_GPL(rcu_barrier_sched); | ||
| 255 | |||
| 256 | static void rcu_migrate_callback(struct rcu_head *notused) | ||
| 257 | { | ||
| 258 | if (atomic_dec_and_test(&rcu_migrate_type_count)) | ||
| 259 | wake_up(&rcu_migrate_wq); | ||
| 260 | } | ||
| 261 | |||
| 262 | extern int rcu_cpu_notify(struct notifier_block *self, | ||
| 263 | unsigned long action, void *hcpu); | ||
| 264 | |||
| 265 | static int __cpuinit rcu_barrier_cpu_hotplug(struct notifier_block *self, | 160 | static int __cpuinit rcu_barrier_cpu_hotplug(struct notifier_block *self, |
| 266 | unsigned long action, void *hcpu) | 161 | unsigned long action, void *hcpu) |
| 267 | { | 162 | { |
| 268 | rcu_cpu_notify(self, action, hcpu); | 163 | return rcu_cpu_notify(self, action, hcpu); |
| 269 | if (action == CPU_DYING) { | ||
| 270 | /* | ||
| 271 | * preempt_disable() in on_each_cpu() prevents stop_machine(), | ||
| 272 | * so when "on_each_cpu(rcu_barrier_func, (void *)type, 1);" | ||
| 273 | * returns, all online cpus have queued rcu_barrier_func(), | ||
| 274 | * and the dead cpu(if it exist) queues rcu_migrate_callback()s. | ||
| 275 | * | ||
| 276 | * These callbacks ensure _rcu_barrier() waits for all | ||
| 277 | * RCU callbacks of the specified type to complete. | ||
| 278 | */ | ||
| 279 | atomic_set(&rcu_migrate_type_count, 3); | ||
| 280 | call_rcu_bh(rcu_migrate_head, rcu_migrate_callback); | ||
| 281 | call_rcu_sched(rcu_migrate_head + 1, rcu_migrate_callback); | ||
| 282 | call_rcu(rcu_migrate_head + 2, rcu_migrate_callback); | ||
| 283 | } else if (action == CPU_DOWN_PREPARE) { | ||
| 284 | /* Don't need to wait until next removal operation. */ | ||
| 285 | /* rcu_migrate_head is protected by cpu_add_remove_lock */ | ||
| 286 | wait_migrated_callbacks(); | ||
| 287 | } | ||
| 288 | |||
| 289 | return NOTIFY_OK; | ||
| 290 | } | 164 | } |
| 291 | 165 | ||
| 292 | void __init rcu_init(void) | 166 | void __init rcu_init(void) |
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 233768f21f97..697c0a0229d4 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c | |||
| @@ -606,8 +606,6 @@ static struct rcu_torture_ops sched_ops_sync = { | |||
| 606 | .name = "sched_sync" | 606 | .name = "sched_sync" |
| 607 | }; | 607 | }; |
| 608 | 608 | ||
| 609 | extern int rcu_expedited_torture_stats(char *page); | ||
| 610 | |||
| 611 | static struct rcu_torture_ops sched_expedited_ops = { | 609 | static struct rcu_torture_ops sched_expedited_ops = { |
| 612 | .init = rcu_sync_torture_init, | 610 | .init = rcu_sync_torture_init, |
| 613 | .cleanup = NULL, | 611 | .cleanup = NULL, |
| @@ -650,7 +648,7 @@ rcu_torture_writer(void *arg) | |||
| 650 | old_rp = rcu_torture_current; | 648 | old_rp = rcu_torture_current; |
| 651 | rp->rtort_mbtest = 1; | 649 | rp->rtort_mbtest = 1; |
| 652 | rcu_assign_pointer(rcu_torture_current, rp); | 650 | rcu_assign_pointer(rcu_torture_current, rp); |
| 653 | smp_wmb(); | 651 | smp_wmb(); /* Mods to old_rp must follow rcu_assign_pointer() */ |
| 654 | if (old_rp) { | 652 | if (old_rp) { |
| 655 | i = old_rp->rtort_pipe_count; | 653 | i = old_rp->rtort_pipe_count; |
| 656 | if (i > RCU_TORTURE_PIPE_LEN) | 654 | if (i > RCU_TORTURE_PIPE_LEN) |
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 52b06f6e158c..705f02ac7433 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
| @@ -49,13 +49,6 @@ | |||
| 49 | 49 | ||
| 50 | #include "rcutree.h" | 50 | #include "rcutree.h" |
| 51 | 51 | ||
| 52 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
| 53 | static struct lock_class_key rcu_lock_key; | ||
| 54 | struct lockdep_map rcu_lock_map = | ||
| 55 | STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key); | ||
| 56 | EXPORT_SYMBOL_GPL(rcu_lock_map); | ||
| 57 | #endif | ||
| 58 | |||
| 59 | /* Data structures. */ | 52 | /* Data structures. */ |
| 60 | 53 | ||
| 61 | #define RCU_STATE_INITIALIZER(name) { \ | 54 | #define RCU_STATE_INITIALIZER(name) { \ |
| @@ -70,6 +63,9 @@ EXPORT_SYMBOL_GPL(rcu_lock_map); | |||
| 70 | .gpnum = -300, \ | 63 | .gpnum = -300, \ |
| 71 | .completed = -300, \ | 64 | .completed = -300, \ |
| 72 | .onofflock = __SPIN_LOCK_UNLOCKED(&name.onofflock), \ | 65 | .onofflock = __SPIN_LOCK_UNLOCKED(&name.onofflock), \ |
| 66 | .orphan_cbs_list = NULL, \ | ||
| 67 | .orphan_cbs_tail = &name.orphan_cbs_list, \ | ||
| 68 | .orphan_qlen = 0, \ | ||
| 73 | .fqslock = __SPIN_LOCK_UNLOCKED(&name.fqslock), \ | 69 | .fqslock = __SPIN_LOCK_UNLOCKED(&name.fqslock), \ |
| 74 | .n_force_qs = 0, \ | 70 | .n_force_qs = 0, \ |
| 75 | .n_force_qs_ngp = 0, \ | 71 | .n_force_qs_ngp = 0, \ |
| @@ -81,24 +77,16 @@ DEFINE_PER_CPU(struct rcu_data, rcu_sched_data); | |||
| 81 | struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh_state); | 77 | struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh_state); |
| 82 | DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); | 78 | DEFINE_PER_CPU(struct rcu_data, rcu_bh_data); |
| 83 | 79 | ||
| 84 | extern long rcu_batches_completed_sched(void); | ||
| 85 | static struct rcu_node *rcu_get_root(struct rcu_state *rsp); | ||
| 86 | static void cpu_quiet_msk(unsigned long mask, struct rcu_state *rsp, | ||
| 87 | struct rcu_node *rnp, unsigned long flags); | ||
| 88 | static void cpu_quiet_msk_finish(struct rcu_state *rsp, unsigned long flags); | ||
| 89 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 90 | static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp); | ||
| 91 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 92 | static void __rcu_process_callbacks(struct rcu_state *rsp, | ||
| 93 | struct rcu_data *rdp); | ||
| 94 | static void __call_rcu(struct rcu_head *head, | ||
| 95 | void (*func)(struct rcu_head *rcu), | ||
| 96 | struct rcu_state *rsp); | ||
| 97 | static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp); | ||
| 98 | static void __cpuinit rcu_init_percpu_data(int cpu, struct rcu_state *rsp, | ||
| 99 | int preemptable); | ||
| 100 | 80 | ||
| 101 | #include "rcutree_plugin.h" | 81 | /* |
| 82 | * Return true if an RCU grace period is in progress. The ACCESS_ONCE()s | ||
| 83 | * permit this function to be invoked without holding the root rcu_node | ||
| 84 | * structure's ->lock, but of course results can be subject to change. | ||
| 85 | */ | ||
| 86 | static int rcu_gp_in_progress(struct rcu_state *rsp) | ||
| 87 | { | ||
| 88 | return ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum); | ||
| 89 | } | ||
| 102 | 90 | ||
| 103 | /* | 91 | /* |
| 104 | * Note a quiescent state. Because we do not need to know | 92 | * Note a quiescent state. Because we do not need to know |
| @@ -137,6 +125,10 @@ static int blimit = 10; /* Maximum callbacks per softirq. */ | |||
| 137 | static int qhimark = 10000; /* If this many pending, ignore blimit. */ | 125 | static int qhimark = 10000; /* If this many pending, ignore blimit. */ |
| 138 | static int qlowmark = 100; /* Once only this many pending, use blimit. */ | 126 | static int qlowmark = 100; /* Once only this many pending, use blimit. */ |
| 139 | 127 | ||
| 128 | module_param(blimit, int, 0); | ||
| 129 | module_param(qhimark, int, 0); | ||
| 130 | module_param(qlowmark, int, 0); | ||
| 131 | |||
| 140 | static void force_quiescent_state(struct rcu_state *rsp, int relaxed); | 132 | static void force_quiescent_state(struct rcu_state *rsp, int relaxed); |
| 141 | static int rcu_pending(int cpu); | 133 | static int rcu_pending(int cpu); |
| 142 | 134 | ||
| @@ -173,9 +165,7 @@ cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp) | |||
| 173 | static int | 165 | static int |
| 174 | cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) | 166 | cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) |
| 175 | { | 167 | { |
| 176 | /* ACCESS_ONCE() because we are accessing outside of lock. */ | 168 | return *rdp->nxttail[RCU_DONE_TAIL] && !rcu_gp_in_progress(rsp); |
| 177 | return *rdp->nxttail[RCU_DONE_TAIL] && | ||
| 178 | ACCESS_ONCE(rsp->completed) == ACCESS_ONCE(rsp->gpnum); | ||
| 179 | } | 169 | } |
| 180 | 170 | ||
| 181 | /* | 171 | /* |
| @@ -369,7 +359,7 @@ static long dyntick_recall_completed(struct rcu_state *rsp) | |||
| 369 | /* | 359 | /* |
| 370 | * Snapshot the specified CPU's dynticks counter so that we can later | 360 | * Snapshot the specified CPU's dynticks counter so that we can later |
| 371 | * credit them with an implicit quiescent state. Return 1 if this CPU | 361 | * credit them with an implicit quiescent state. Return 1 if this CPU |
| 372 | * is already in a quiescent state courtesy of dynticks idle mode. | 362 | * is in dynticks idle mode, which is an extended quiescent state. |
| 373 | */ | 363 | */ |
| 374 | static int dyntick_save_progress_counter(struct rcu_data *rdp) | 364 | static int dyntick_save_progress_counter(struct rcu_data *rdp) |
| 375 | { | 365 | { |
| @@ -475,30 +465,34 @@ static void print_other_cpu_stall(struct rcu_state *rsp) | |||
| 475 | long delta; | 465 | long delta; |
| 476 | unsigned long flags; | 466 | unsigned long flags; |
| 477 | struct rcu_node *rnp = rcu_get_root(rsp); | 467 | struct rcu_node *rnp = rcu_get_root(rsp); |
| 478 | struct rcu_node *rnp_cur = rsp->level[NUM_RCU_LVLS - 1]; | ||
| 479 | struct rcu_node *rnp_end = &rsp->node[NUM_RCU_NODES]; | ||
| 480 | 468 | ||
| 481 | /* Only let one CPU complain about others per time interval. */ | 469 | /* Only let one CPU complain about others per time interval. */ |
| 482 | 470 | ||
| 483 | spin_lock_irqsave(&rnp->lock, flags); | 471 | spin_lock_irqsave(&rnp->lock, flags); |
| 484 | delta = jiffies - rsp->jiffies_stall; | 472 | delta = jiffies - rsp->jiffies_stall; |
| 485 | if (delta < RCU_STALL_RAT_DELAY || rsp->gpnum == rsp->completed) { | 473 | if (delta < RCU_STALL_RAT_DELAY || !rcu_gp_in_progress(rsp)) { |
| 486 | spin_unlock_irqrestore(&rnp->lock, flags); | 474 | spin_unlock_irqrestore(&rnp->lock, flags); |
| 487 | return; | 475 | return; |
| 488 | } | 476 | } |
| 489 | rsp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_RECHECK; | 477 | rsp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_RECHECK; |
| 478 | |||
| 479 | /* | ||
| 480 | * Now rat on any tasks that got kicked up to the root rcu_node | ||
| 481 | * due to CPU offlining. | ||
| 482 | */ | ||
| 483 | rcu_print_task_stall(rnp); | ||
| 490 | spin_unlock_irqrestore(&rnp->lock, flags); | 484 | spin_unlock_irqrestore(&rnp->lock, flags); |
| 491 | 485 | ||
| 492 | /* OK, time to rat on our buddy... */ | 486 | /* OK, time to rat on our buddy... */ |
| 493 | 487 | ||
| 494 | printk(KERN_ERR "INFO: RCU detected CPU stalls:"); | 488 | printk(KERN_ERR "INFO: RCU detected CPU stalls:"); |
| 495 | for (; rnp_cur < rnp_end; rnp_cur++) { | 489 | rcu_for_each_leaf_node(rsp, rnp) { |
| 496 | rcu_print_task_stall(rnp); | 490 | rcu_print_task_stall(rnp); |
| 497 | if (rnp_cur->qsmask == 0) | 491 | if (rnp->qsmask == 0) |
| 498 | continue; | 492 | continue; |
| 499 | for (cpu = 0; cpu <= rnp_cur->grphi - rnp_cur->grplo; cpu++) | 493 | for (cpu = 0; cpu <= rnp->grphi - rnp->grplo; cpu++) |
| 500 | if (rnp_cur->qsmask & (1UL << cpu)) | 494 | if (rnp->qsmask & (1UL << cpu)) |
| 501 | printk(" %d", rnp_cur->grplo + cpu); | 495 | printk(" %d", rnp->grplo + cpu); |
| 502 | } | 496 | } |
| 503 | printk(" (detected by %d, t=%ld jiffies)\n", | 497 | printk(" (detected by %d, t=%ld jiffies)\n", |
| 504 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); | 498 | smp_processor_id(), (long)(jiffies - rsp->gp_start)); |
| @@ -537,8 +531,7 @@ static void check_cpu_stall(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 537 | /* We haven't checked in, so go dump stack. */ | 531 | /* We haven't checked in, so go dump stack. */ |
| 538 | print_cpu_stall(rsp); | 532 | print_cpu_stall(rsp); |
| 539 | 533 | ||
| 540 | } else if (rsp->gpnum != rsp->completed && | 534 | } else if (rcu_gp_in_progress(rsp) && delta >= RCU_STALL_RAT_DELAY) { |
| 541 | delta >= RCU_STALL_RAT_DELAY) { | ||
| 542 | 535 | ||
| 543 | /* They had two time units to dump stack, so complain. */ | 536 | /* They had two time units to dump stack, so complain. */ |
| 544 | print_other_cpu_stall(rsp); | 537 | print_other_cpu_stall(rsp); |
| @@ -617,9 +610,15 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
| 617 | note_new_gpnum(rsp, rdp); | 610 | note_new_gpnum(rsp, rdp); |
| 618 | 611 | ||
| 619 | /* | 612 | /* |
| 620 | * Because we are first, we know that all our callbacks will | 613 | * Because this CPU just now started the new grace period, we know |
| 621 | * be covered by this upcoming grace period, even the ones | 614 | * that all of its callbacks will be covered by this upcoming grace |
| 622 | * that were registered arbitrarily recently. | 615 | * period, even the ones that were registered arbitrarily recently. |
| 616 | * Therefore, advance all outstanding callbacks to RCU_WAIT_TAIL. | ||
| 617 | * | ||
| 618 | * Other CPUs cannot be sure exactly when the grace period started. | ||
| 619 | * Therefore, their recently registered callbacks must pass through | ||
| 620 | * an additional RCU_NEXT_READY stage, so that they will be handled | ||
| 621 | * by the next RCU grace period. | ||
| 623 | */ | 622 | */ |
| 624 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | 623 | rdp->nxttail[RCU_NEXT_READY_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; |
| 625 | rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | 624 | rdp->nxttail[RCU_WAIT_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; |
| @@ -657,7 +656,7 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
| 657 | * one corresponding to this CPU, due to the fact that we have | 656 | * one corresponding to this CPU, due to the fact that we have |
| 658 | * irqs disabled. | 657 | * irqs disabled. |
| 659 | */ | 658 | */ |
| 660 | for (rnp = &rsp->node[0]; rnp < &rsp->node[NUM_RCU_NODES]; rnp++) { | 659 | rcu_for_each_node_breadth_first(rsp, rnp) { |
| 661 | spin_lock(&rnp->lock); /* irqs already disabled. */ | 660 | spin_lock(&rnp->lock); /* irqs already disabled. */ |
| 662 | rcu_preempt_check_blocked_tasks(rnp); | 661 | rcu_preempt_check_blocked_tasks(rnp); |
| 663 | rnp->qsmask = rnp->qsmaskinit; | 662 | rnp->qsmask = rnp->qsmaskinit; |
| @@ -703,9 +702,9 @@ rcu_process_gp_end(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 703 | * hold rnp->lock, as required by rcu_start_gp(), which will release it. | 702 | * hold rnp->lock, as required by rcu_start_gp(), which will release it. |
| 704 | */ | 703 | */ |
| 705 | static void cpu_quiet_msk_finish(struct rcu_state *rsp, unsigned long flags) | 704 | static void cpu_quiet_msk_finish(struct rcu_state *rsp, unsigned long flags) |
| 706 | __releases(rnp->lock) | 705 | __releases(rcu_get_root(rsp)->lock) |
| 707 | { | 706 | { |
| 708 | WARN_ON_ONCE(rsp->completed == rsp->gpnum); | 707 | WARN_ON_ONCE(!rcu_gp_in_progress(rsp)); |
| 709 | rsp->completed = rsp->gpnum; | 708 | rsp->completed = rsp->gpnum; |
| 710 | rcu_process_gp_end(rsp, rsp->rda[smp_processor_id()]); | 709 | rcu_process_gp_end(rsp, rsp->rda[smp_processor_id()]); |
| 711 | rcu_start_gp(rsp, flags); /* releases root node's rnp->lock. */ | 710 | rcu_start_gp(rsp, flags); /* releases root node's rnp->lock. */ |
| @@ -842,17 +841,63 @@ rcu_check_quiescent_state(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 842 | #ifdef CONFIG_HOTPLUG_CPU | 841 | #ifdef CONFIG_HOTPLUG_CPU |
| 843 | 842 | ||
| 844 | /* | 843 | /* |
| 844 | * Move a dying CPU's RCU callbacks to the ->orphan_cbs_list for the | ||
| 845 | * specified flavor of RCU. The callbacks will be adopted by the next | ||
| 846 | * _rcu_barrier() invocation or by the CPU_DEAD notifier, whichever | ||
| 847 | * comes first. Because this is invoked from the CPU_DYING notifier, | ||
| 848 | * irqs are already disabled. | ||
| 849 | */ | ||
| 850 | static void rcu_send_cbs_to_orphanage(struct rcu_state *rsp) | ||
| 851 | { | ||
| 852 | int i; | ||
| 853 | struct rcu_data *rdp = rsp->rda[smp_processor_id()]; | ||
| 854 | |||
| 855 | if (rdp->nxtlist == NULL) | ||
| 856 | return; /* irqs disabled, so comparison is stable. */ | ||
| 857 | spin_lock(&rsp->onofflock); /* irqs already disabled. */ | ||
| 858 | *rsp->orphan_cbs_tail = rdp->nxtlist; | ||
| 859 | rsp->orphan_cbs_tail = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 860 | rdp->nxtlist = NULL; | ||
| 861 | for (i = 0; i < RCU_NEXT_SIZE; i++) | ||
| 862 | rdp->nxttail[i] = &rdp->nxtlist; | ||
| 863 | rsp->orphan_qlen += rdp->qlen; | ||
| 864 | rdp->qlen = 0; | ||
| 865 | spin_unlock(&rsp->onofflock); /* irqs remain disabled. */ | ||
| 866 | } | ||
| 867 | |||
| 868 | /* | ||
| 869 | * Adopt previously orphaned RCU callbacks. | ||
| 870 | */ | ||
| 871 | static void rcu_adopt_orphan_cbs(struct rcu_state *rsp) | ||
| 872 | { | ||
| 873 | unsigned long flags; | ||
| 874 | struct rcu_data *rdp; | ||
| 875 | |||
| 876 | spin_lock_irqsave(&rsp->onofflock, flags); | ||
| 877 | rdp = rsp->rda[smp_processor_id()]; | ||
| 878 | if (rsp->orphan_cbs_list == NULL) { | ||
| 879 | spin_unlock_irqrestore(&rsp->onofflock, flags); | ||
| 880 | return; | ||
| 881 | } | ||
| 882 | *rdp->nxttail[RCU_NEXT_TAIL] = rsp->orphan_cbs_list; | ||
| 883 | rdp->nxttail[RCU_NEXT_TAIL] = rsp->orphan_cbs_tail; | ||
| 884 | rdp->qlen += rsp->orphan_qlen; | ||
| 885 | rsp->orphan_cbs_list = NULL; | ||
| 886 | rsp->orphan_cbs_tail = &rsp->orphan_cbs_list; | ||
| 887 | rsp->orphan_qlen = 0; | ||
| 888 | spin_unlock_irqrestore(&rsp->onofflock, flags); | ||
| 889 | } | ||
| 890 | |||
| 891 | /* | ||
| 845 | * Remove the outgoing CPU from the bitmasks in the rcu_node hierarchy | 892 | * Remove the outgoing CPU from the bitmasks in the rcu_node hierarchy |
| 846 | * and move all callbacks from the outgoing CPU to the current one. | 893 | * and move all callbacks from the outgoing CPU to the current one. |
| 847 | */ | 894 | */ |
| 848 | static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) | 895 | static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) |
| 849 | { | 896 | { |
| 850 | int i; | ||
| 851 | unsigned long flags; | 897 | unsigned long flags; |
| 852 | long lastcomp; | 898 | long lastcomp; |
| 853 | unsigned long mask; | 899 | unsigned long mask; |
| 854 | struct rcu_data *rdp = rsp->rda[cpu]; | 900 | struct rcu_data *rdp = rsp->rda[cpu]; |
| 855 | struct rcu_data *rdp_me; | ||
| 856 | struct rcu_node *rnp; | 901 | struct rcu_node *rnp; |
| 857 | 902 | ||
| 858 | /* Exclude any attempts to start a new grace period. */ | 903 | /* Exclude any attempts to start a new grace period. */ |
| @@ -875,32 +920,9 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp) | |||
| 875 | } while (rnp != NULL); | 920 | } while (rnp != NULL); |
| 876 | lastcomp = rsp->completed; | 921 | lastcomp = rsp->completed; |
| 877 | 922 | ||
| 878 | spin_unlock(&rsp->onofflock); /* irqs remain disabled. */ | 923 | spin_unlock_irqrestore(&rsp->onofflock, flags); |
| 879 | 924 | ||
| 880 | /* | 925 | rcu_adopt_orphan_cbs(rsp); |
| 881 | * Move callbacks from the outgoing CPU to the running CPU. | ||
| 882 | * Note that the outgoing CPU is now quiscent, so it is now | ||
| 883 | * (uncharacteristically) safe to access its rcu_data structure. | ||
| 884 | * Note also that we must carefully retain the order of the | ||
| 885 | * outgoing CPU's callbacks in order for rcu_barrier() to work | ||
| 886 | * correctly. Finally, note that we start all the callbacks | ||
| 887 | * afresh, even those that have passed through a grace period | ||
| 888 | * and are therefore ready to invoke. The theory is that hotplug | ||
| 889 | * events are rare, and that if they are frequent enough to | ||
| 890 | * indefinitely delay callbacks, you have far worse things to | ||
| 891 | * be worrying about. | ||
| 892 | */ | ||
| 893 | rdp_me = rsp->rda[smp_processor_id()]; | ||
| 894 | if (rdp->nxtlist != NULL) { | ||
| 895 | *rdp_me->nxttail[RCU_NEXT_TAIL] = rdp->nxtlist; | ||
| 896 | rdp_me->nxttail[RCU_NEXT_TAIL] = rdp->nxttail[RCU_NEXT_TAIL]; | ||
| 897 | rdp->nxtlist = NULL; | ||
| 898 | for (i = 0; i < RCU_NEXT_SIZE; i++) | ||
| 899 | rdp->nxttail[i] = &rdp->nxtlist; | ||
| 900 | rdp_me->qlen += rdp->qlen; | ||
| 901 | rdp->qlen = 0; | ||
| 902 | } | ||
| 903 | local_irq_restore(flags); | ||
| 904 | } | 926 | } |
| 905 | 927 | ||
| 906 | /* | 928 | /* |
| @@ -918,6 +940,14 @@ static void rcu_offline_cpu(int cpu) | |||
| 918 | 940 | ||
| 919 | #else /* #ifdef CONFIG_HOTPLUG_CPU */ | 941 | #else /* #ifdef CONFIG_HOTPLUG_CPU */ |
| 920 | 942 | ||
| 943 | static void rcu_send_cbs_to_orphanage(struct rcu_state *rsp) | ||
| 944 | { | ||
| 945 | } | ||
| 946 | |||
| 947 | static void rcu_adopt_orphan_cbs(struct rcu_state *rsp) | ||
| 948 | { | ||
| 949 | } | ||
| 950 | |||
| 921 | static void rcu_offline_cpu(int cpu) | 951 | static void rcu_offline_cpu(int cpu) |
| 922 | { | 952 | { |
| 923 | } | 953 | } |
| @@ -1050,33 +1080,32 @@ static int rcu_process_dyntick(struct rcu_state *rsp, long lastcomp, | |||
| 1050 | int cpu; | 1080 | int cpu; |
| 1051 | unsigned long flags; | 1081 | unsigned long flags; |
| 1052 | unsigned long mask; | 1082 | unsigned long mask; |
| 1053 | struct rcu_node *rnp_cur = rsp->level[NUM_RCU_LVLS - 1]; | 1083 | struct rcu_node *rnp; |
| 1054 | struct rcu_node *rnp_end = &rsp->node[NUM_RCU_NODES]; | ||
| 1055 | 1084 | ||
| 1056 | for (; rnp_cur < rnp_end; rnp_cur++) { | 1085 | rcu_for_each_leaf_node(rsp, rnp) { |
| 1057 | mask = 0; | 1086 | mask = 0; |
| 1058 | spin_lock_irqsave(&rnp_cur->lock, flags); | 1087 | spin_lock_irqsave(&rnp->lock, flags); |
| 1059 | if (rsp->completed != lastcomp) { | 1088 | if (rsp->completed != lastcomp) { |
| 1060 | spin_unlock_irqrestore(&rnp_cur->lock, flags); | 1089 | spin_unlock_irqrestore(&rnp->lock, flags); |
| 1061 | return 1; | 1090 | return 1; |
| 1062 | } | 1091 | } |
| 1063 | if (rnp_cur->qsmask == 0) { | 1092 | if (rnp->qsmask == 0) { |
| 1064 | spin_unlock_irqrestore(&rnp_cur->lock, flags); | 1093 | spin_unlock_irqrestore(&rnp->lock, flags); |
| 1065 | continue; | 1094 | continue; |
| 1066 | } | 1095 | } |
| 1067 | cpu = rnp_cur->grplo; | 1096 | cpu = rnp->grplo; |
| 1068 | bit = 1; | 1097 | bit = 1; |
| 1069 | for (; cpu <= rnp_cur->grphi; cpu++, bit <<= 1) { | 1098 | for (; cpu <= rnp->grphi; cpu++, bit <<= 1) { |
| 1070 | if ((rnp_cur->qsmask & bit) != 0 && f(rsp->rda[cpu])) | 1099 | if ((rnp->qsmask & bit) != 0 && f(rsp->rda[cpu])) |
| 1071 | mask |= bit; | 1100 | mask |= bit; |
| 1072 | } | 1101 | } |
| 1073 | if (mask != 0 && rsp->completed == lastcomp) { | 1102 | if (mask != 0 && rsp->completed == lastcomp) { |
| 1074 | 1103 | ||
| 1075 | /* cpu_quiet_msk() releases rnp_cur->lock. */ | 1104 | /* cpu_quiet_msk() releases rnp->lock. */ |
| 1076 | cpu_quiet_msk(mask, rsp, rnp_cur, flags); | 1105 | cpu_quiet_msk(mask, rsp, rnp, flags); |
| 1077 | continue; | 1106 | continue; |
| 1078 | } | 1107 | } |
| 1079 | spin_unlock_irqrestore(&rnp_cur->lock, flags); | 1108 | spin_unlock_irqrestore(&rnp->lock, flags); |
| 1080 | } | 1109 | } |
| 1081 | return 0; | 1110 | return 0; |
| 1082 | } | 1111 | } |
| @@ -1092,7 +1121,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
| 1092 | struct rcu_node *rnp = rcu_get_root(rsp); | 1121 | struct rcu_node *rnp = rcu_get_root(rsp); |
| 1093 | u8 signaled; | 1122 | u8 signaled; |
| 1094 | 1123 | ||
| 1095 | if (ACCESS_ONCE(rsp->completed) == ACCESS_ONCE(rsp->gpnum)) | 1124 | if (!rcu_gp_in_progress(rsp)) |
| 1096 | return; /* No grace period in progress, nothing to force. */ | 1125 | return; /* No grace period in progress, nothing to force. */ |
| 1097 | if (!spin_trylock_irqsave(&rsp->fqslock, flags)) { | 1126 | if (!spin_trylock_irqsave(&rsp->fqslock, flags)) { |
| 1098 | rsp->n_force_qs_lh++; /* Inexact, can lose counts. Tough! */ | 1127 | rsp->n_force_qs_lh++; /* Inexact, can lose counts. Tough! */ |
| @@ -1251,7 +1280,7 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), | |||
| 1251 | rdp->nxttail[RCU_NEXT_TAIL] = &head->next; | 1280 | rdp->nxttail[RCU_NEXT_TAIL] = &head->next; |
| 1252 | 1281 | ||
| 1253 | /* Start a new grace period if one not already started. */ | 1282 | /* Start a new grace period if one not already started. */ |
| 1254 | if (ACCESS_ONCE(rsp->completed) == ACCESS_ONCE(rsp->gpnum)) { | 1283 | if (!rcu_gp_in_progress(rsp)) { |
| 1255 | unsigned long nestflag; | 1284 | unsigned long nestflag; |
| 1256 | struct rcu_node *rnp_root = rcu_get_root(rsp); | 1285 | struct rcu_node *rnp_root = rcu_get_root(rsp); |
| 1257 | 1286 | ||
| @@ -1331,7 +1360,7 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | |||
| 1331 | } | 1360 | } |
| 1332 | 1361 | ||
| 1333 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ | 1362 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ |
| 1334 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && | 1363 | if (rcu_gp_in_progress(rsp) && |
| 1335 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0)) { | 1364 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0)) { |
| 1336 | rdp->n_rp_need_fqs++; | 1365 | rdp->n_rp_need_fqs++; |
| 1337 | return 1; | 1366 | return 1; |
| @@ -1368,6 +1397,82 @@ int rcu_needs_cpu(int cpu) | |||
| 1368 | rcu_preempt_needs_cpu(cpu); | 1397 | rcu_preempt_needs_cpu(cpu); |
| 1369 | } | 1398 | } |
| 1370 | 1399 | ||
| 1400 | static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL}; | ||
| 1401 | static atomic_t rcu_barrier_cpu_count; | ||
| 1402 | static DEFINE_MUTEX(rcu_barrier_mutex); | ||
| 1403 | static struct completion rcu_barrier_completion; | ||
| 1404 | |||
| 1405 | static void rcu_barrier_callback(struct rcu_head *notused) | ||
| 1406 | { | ||
| 1407 | if (atomic_dec_and_test(&rcu_barrier_cpu_count)) | ||
| 1408 | complete(&rcu_barrier_completion); | ||
| 1409 | } | ||
| 1410 | |||
| 1411 | /* | ||
| 1412 | * Called with preemption disabled, and from cross-cpu IRQ context. | ||
| 1413 | */ | ||
| 1414 | static void rcu_barrier_func(void *type) | ||
| 1415 | { | ||
| 1416 | int cpu = smp_processor_id(); | ||
| 1417 | struct rcu_head *head = &per_cpu(rcu_barrier_head, cpu); | ||
| 1418 | void (*call_rcu_func)(struct rcu_head *head, | ||
| 1419 | void (*func)(struct rcu_head *head)); | ||
| 1420 | |||
| 1421 | atomic_inc(&rcu_barrier_cpu_count); | ||
| 1422 | call_rcu_func = type; | ||
| 1423 | call_rcu_func(head, rcu_barrier_callback); | ||
| 1424 | } | ||
| 1425 | |||
| 1426 | /* | ||
| 1427 | * Orchestrate the specified type of RCU barrier, waiting for all | ||
| 1428 | * RCU callbacks of the specified type to complete. | ||
| 1429 | */ | ||
| 1430 | static void _rcu_barrier(struct rcu_state *rsp, | ||
| 1431 | void (*call_rcu_func)(struct rcu_head *head, | ||
| 1432 | void (*func)(struct rcu_head *head))) | ||
| 1433 | { | ||
| 1434 | BUG_ON(in_interrupt()); | ||
| 1435 | /* Take mutex to serialize concurrent rcu_barrier() requests. */ | ||
| 1436 | mutex_lock(&rcu_barrier_mutex); | ||
| 1437 | init_completion(&rcu_barrier_completion); | ||
| 1438 | /* | ||
| 1439 | * Initialize rcu_barrier_cpu_count to 1, then invoke | ||
| 1440 | * rcu_barrier_func() on each CPU, so that each CPU also has | ||
| 1441 | * incremented rcu_barrier_cpu_count. Only then is it safe to | ||
| 1442 | * decrement rcu_barrier_cpu_count -- otherwise the first CPU | ||
| 1443 | * might complete its grace period before all of the other CPUs | ||
| 1444 | * did their increment, causing this function to return too | ||
| 1445 | * early. | ||
| 1446 | */ | ||
| 1447 | atomic_set(&rcu_barrier_cpu_count, 1); | ||
| 1448 | preempt_disable(); /* stop CPU_DYING from filling orphan_cbs_list */ | ||
| 1449 | rcu_adopt_orphan_cbs(rsp); | ||
| 1450 | on_each_cpu(rcu_barrier_func, (void *)call_rcu_func, 1); | ||
| 1451 | preempt_enable(); /* CPU_DYING can again fill orphan_cbs_list */ | ||
| 1452 | if (atomic_dec_and_test(&rcu_barrier_cpu_count)) | ||
| 1453 | complete(&rcu_barrier_completion); | ||
| 1454 | wait_for_completion(&rcu_barrier_completion); | ||
| 1455 | mutex_unlock(&rcu_barrier_mutex); | ||
| 1456 | } | ||
| 1457 | |||
| 1458 | /** | ||
| 1459 | * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. | ||
| 1460 | */ | ||
| 1461 | void rcu_barrier_bh(void) | ||
| 1462 | { | ||
| 1463 | _rcu_barrier(&rcu_bh_state, call_rcu_bh); | ||
| 1464 | } | ||
| 1465 | EXPORT_SYMBOL_GPL(rcu_barrier_bh); | ||
| 1466 | |||
| 1467 | /** | ||
| 1468 | * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks. | ||
| 1469 | */ | ||
| 1470 | void rcu_barrier_sched(void) | ||
| 1471 | { | ||
| 1472 | _rcu_barrier(&rcu_sched_state, call_rcu_sched); | ||
| 1473 | } | ||
| 1474 | EXPORT_SYMBOL_GPL(rcu_barrier_sched); | ||
| 1475 | |||
| 1371 | /* | 1476 | /* |
| 1372 | * Do boot-time initialization of a CPU's per-CPU RCU data. | 1477 | * Do boot-time initialization of a CPU's per-CPU RCU data. |
| 1373 | */ | 1478 | */ |
| @@ -1464,6 +1569,22 @@ int __cpuinit rcu_cpu_notify(struct notifier_block *self, | |||
| 1464 | case CPU_UP_PREPARE_FROZEN: | 1569 | case CPU_UP_PREPARE_FROZEN: |
| 1465 | rcu_online_cpu(cpu); | 1570 | rcu_online_cpu(cpu); |
| 1466 | break; | 1571 | break; |
| 1572 | case CPU_DYING: | ||
| 1573 | case CPU_DYING_FROZEN: | ||
| 1574 | /* | ||
| 1575 | * preempt_disable() in _rcu_barrier() prevents stop_machine(), | ||
| 1576 | * so when "on_each_cpu(rcu_barrier_func, (void *)type, 1);" | ||
| 1577 | * returns, all online cpus have queued rcu_barrier_func(). | ||
| 1578 | * The dying CPU clears its cpu_online_mask bit and | ||
| 1579 | * moves all of its RCU callbacks to ->orphan_cbs_list | ||
| 1580 | * in the context of stop_machine(), so subsequent calls | ||
| 1581 | * to _rcu_barrier() will adopt these callbacks and only | ||
| 1582 | * then queue rcu_barrier_func() on all remaining CPUs. | ||
| 1583 | */ | ||
| 1584 | rcu_send_cbs_to_orphanage(&rcu_bh_state); | ||
| 1585 | rcu_send_cbs_to_orphanage(&rcu_sched_state); | ||
| 1586 | rcu_preempt_send_cbs_to_orphanage(); | ||
| 1587 | break; | ||
| 1467 | case CPU_DEAD: | 1588 | case CPU_DEAD: |
| 1468 | case CPU_DEAD_FROZEN: | 1589 | case CPU_DEAD_FROZEN: |
| 1469 | case CPU_UP_CANCELED: | 1590 | case CPU_UP_CANCELED: |
| @@ -1526,7 +1647,8 @@ static void __init rcu_init_one(struct rcu_state *rsp) | |||
| 1526 | cpustride *= rsp->levelspread[i]; | 1647 | cpustride *= rsp->levelspread[i]; |
| 1527 | rnp = rsp->level[i]; | 1648 | rnp = rsp->level[i]; |
| 1528 | for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) { | 1649 | for (j = 0; j < rsp->levelcnt[i]; j++, rnp++) { |
| 1529 | spin_lock_init(&rnp->lock); | 1650 | if (rnp != rcu_get_root(rsp)) |
| 1651 | spin_lock_init(&rnp->lock); | ||
| 1530 | rnp->gpnum = 0; | 1652 | rnp->gpnum = 0; |
| 1531 | rnp->qsmask = 0; | 1653 | rnp->qsmask = 0; |
| 1532 | rnp->qsmaskinit = 0; | 1654 | rnp->qsmaskinit = 0; |
| @@ -1549,6 +1671,7 @@ static void __init rcu_init_one(struct rcu_state *rsp) | |||
| 1549 | INIT_LIST_HEAD(&rnp->blocked_tasks[1]); | 1671 | INIT_LIST_HEAD(&rnp->blocked_tasks[1]); |
| 1550 | } | 1672 | } |
| 1551 | } | 1673 | } |
| 1674 | spin_lock_init(&rcu_get_root(rsp)->lock); | ||
| 1552 | } | 1675 | } |
| 1553 | 1676 | ||
| 1554 | /* | 1677 | /* |
| @@ -1558,6 +1681,10 @@ static void __init rcu_init_one(struct rcu_state *rsp) | |||
| 1558 | */ | 1681 | */ |
| 1559 | #define RCU_INIT_FLAVOR(rsp, rcu_data) \ | 1682 | #define RCU_INIT_FLAVOR(rsp, rcu_data) \ |
| 1560 | do { \ | 1683 | do { \ |
| 1684 | int i; \ | ||
| 1685 | int j; \ | ||
| 1686 | struct rcu_node *rnp; \ | ||
| 1687 | \ | ||
| 1561 | rcu_init_one(rsp); \ | 1688 | rcu_init_one(rsp); \ |
| 1562 | rnp = (rsp)->level[NUM_RCU_LVLS - 1]; \ | 1689 | rnp = (rsp)->level[NUM_RCU_LVLS - 1]; \ |
| 1563 | j = 0; \ | 1690 | j = 0; \ |
| @@ -1570,31 +1697,8 @@ do { \ | |||
| 1570 | } \ | 1697 | } \ |
| 1571 | } while (0) | 1698 | } while (0) |
| 1572 | 1699 | ||
| 1573 | #ifdef CONFIG_TREE_PREEMPT_RCU | ||
| 1574 | |||
| 1575 | void __init __rcu_init_preempt(void) | ||
| 1576 | { | ||
| 1577 | int i; /* All used by RCU_INIT_FLAVOR(). */ | ||
| 1578 | int j; | ||
| 1579 | struct rcu_node *rnp; | ||
| 1580 | |||
| 1581 | RCU_INIT_FLAVOR(&rcu_preempt_state, rcu_preempt_data); | ||
| 1582 | } | ||
| 1583 | |||
| 1584 | #else /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | ||
| 1585 | |||
| 1586 | void __init __rcu_init_preempt(void) | ||
| 1587 | { | ||
| 1588 | } | ||
| 1589 | |||
| 1590 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ | ||
| 1591 | |||
| 1592 | void __init __rcu_init(void) | 1700 | void __init __rcu_init(void) |
| 1593 | { | 1701 | { |
| 1594 | int i; /* All used by RCU_INIT_FLAVOR(). */ | ||
| 1595 | int j; | ||
| 1596 | struct rcu_node *rnp; | ||
| 1597 | |||
| 1598 | rcu_bootup_announce(); | 1702 | rcu_bootup_announce(); |
| 1599 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 1703 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
| 1600 | printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n"); | 1704 | printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n"); |
| @@ -1605,6 +1709,4 @@ void __init __rcu_init(void) | |||
| 1605 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); | 1709 | open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); |
| 1606 | } | 1710 | } |
| 1607 | 1711 | ||
| 1608 | module_param(blimit, int, 0); | 1712 | #include "rcutree_plugin.h" |
| 1609 | module_param(qhimark, int, 0); | ||
| 1610 | module_param(qlowmark, int, 0); | ||
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index 8e8287a983c2..b40ac5706040 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
| @@ -48,14 +48,14 @@ | |||
| 48 | #elif NR_CPUS <= RCU_FANOUT_SQ | 48 | #elif NR_CPUS <= RCU_FANOUT_SQ |
| 49 | # define NUM_RCU_LVLS 2 | 49 | # define NUM_RCU_LVLS 2 |
| 50 | # define NUM_RCU_LVL_0 1 | 50 | # define NUM_RCU_LVL_0 1 |
| 51 | # define NUM_RCU_LVL_1 (((NR_CPUS) + RCU_FANOUT - 1) / RCU_FANOUT) | 51 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) |
| 52 | # define NUM_RCU_LVL_2 (NR_CPUS) | 52 | # define NUM_RCU_LVL_2 (NR_CPUS) |
| 53 | # define NUM_RCU_LVL_3 0 | 53 | # define NUM_RCU_LVL_3 0 |
| 54 | #elif NR_CPUS <= RCU_FANOUT_CUBE | 54 | #elif NR_CPUS <= RCU_FANOUT_CUBE |
| 55 | # define NUM_RCU_LVLS 3 | 55 | # define NUM_RCU_LVLS 3 |
| 56 | # define NUM_RCU_LVL_0 1 | 56 | # define NUM_RCU_LVL_0 1 |
| 57 | # define NUM_RCU_LVL_1 (((NR_CPUS) + RCU_FANOUT_SQ - 1) / RCU_FANOUT_SQ) | 57 | # define NUM_RCU_LVL_1 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT_SQ) |
| 58 | # define NUM_RCU_LVL_2 (((NR_CPUS) + (RCU_FANOUT) - 1) / (RCU_FANOUT)) | 58 | # define NUM_RCU_LVL_2 DIV_ROUND_UP(NR_CPUS, RCU_FANOUT) |
| 59 | # define NUM_RCU_LVL_3 NR_CPUS | 59 | # define NUM_RCU_LVL_3 NR_CPUS |
| 60 | #else | 60 | #else |
| 61 | # error "CONFIG_RCU_FANOUT insufficient for NR_CPUS" | 61 | # error "CONFIG_RCU_FANOUT insufficient for NR_CPUS" |
| @@ -79,15 +79,21 @@ struct rcu_dynticks { | |||
| 79 | * Definition for node within the RCU grace-period-detection hierarchy. | 79 | * Definition for node within the RCU grace-period-detection hierarchy. |
| 80 | */ | 80 | */ |
| 81 | struct rcu_node { | 81 | struct rcu_node { |
| 82 | spinlock_t lock; | 82 | spinlock_t lock; /* Root rcu_node's lock protects some */ |
| 83 | /* rcu_state fields as well as following. */ | ||
| 83 | long gpnum; /* Current grace period for this node. */ | 84 | long gpnum; /* Current grace period for this node. */ |
| 84 | /* This will either be equal to or one */ | 85 | /* This will either be equal to or one */ |
| 85 | /* behind the root rcu_node's gpnum. */ | 86 | /* behind the root rcu_node's gpnum. */ |
| 86 | unsigned long qsmask; /* CPUs or groups that need to switch in */ | 87 | unsigned long qsmask; /* CPUs or groups that need to switch in */ |
| 87 | /* order for current grace period to proceed.*/ | 88 | /* order for current grace period to proceed.*/ |
| 89 | /* In leaf rcu_node, each bit corresponds to */ | ||
| 90 | /* an rcu_data structure, otherwise, each */ | ||
| 91 | /* bit corresponds to a child rcu_node */ | ||
| 92 | /* structure. */ | ||
| 88 | unsigned long qsmaskinit; | 93 | unsigned long qsmaskinit; |
| 89 | /* Per-GP initialization for qsmask. */ | 94 | /* Per-GP initialization for qsmask. */ |
| 90 | unsigned long grpmask; /* Mask to apply to parent qsmask. */ | 95 | unsigned long grpmask; /* Mask to apply to parent qsmask. */ |
| 96 | /* Only one bit will be set in this mask. */ | ||
| 91 | int grplo; /* lowest-numbered CPU or group here. */ | 97 | int grplo; /* lowest-numbered CPU or group here. */ |
| 92 | int grphi; /* highest-numbered CPU or group here. */ | 98 | int grphi; /* highest-numbered CPU or group here. */ |
| 93 | u8 grpnum; /* CPU/group number for next level up. */ | 99 | u8 grpnum; /* CPU/group number for next level up. */ |
| @@ -95,8 +101,23 @@ struct rcu_node { | |||
| 95 | struct rcu_node *parent; | 101 | struct rcu_node *parent; |
| 96 | struct list_head blocked_tasks[2]; | 102 | struct list_head blocked_tasks[2]; |
| 97 | /* Tasks blocked in RCU read-side critsect. */ | 103 | /* Tasks blocked in RCU read-side critsect. */ |
| 104 | /* Grace period number (->gpnum) x blocked */ | ||
| 105 | /* by tasks on the (x & 0x1) element of the */ | ||
| 106 | /* blocked_tasks[] array. */ | ||
| 98 | } ____cacheline_internodealigned_in_smp; | 107 | } ____cacheline_internodealigned_in_smp; |
| 99 | 108 | ||
| 109 | /* | ||
| 110 | * Do a full breadth-first scan of the rcu_node structures for the | ||
| 111 | * specified rcu_state structure. | ||
| 112 | */ | ||
| 113 | #define rcu_for_each_node_breadth_first(rsp, rnp) \ | ||
| 114 | for ((rnp) = &(rsp)->node[0]; \ | ||
| 115 | (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | ||
| 116 | |||
| 117 | #define rcu_for_each_leaf_node(rsp, rnp) \ | ||
| 118 | for ((rnp) = (rsp)->level[NUM_RCU_LVLS - 1]; \ | ||
| 119 | (rnp) < &(rsp)->node[NUM_RCU_NODES]; (rnp)++) | ||
| 120 | |||
| 100 | /* Index values for nxttail array in struct rcu_data. */ | 121 | /* Index values for nxttail array in struct rcu_data. */ |
| 101 | #define RCU_DONE_TAIL 0 /* Also RCU_WAIT head. */ | 122 | #define RCU_DONE_TAIL 0 /* Also RCU_WAIT head. */ |
| 102 | #define RCU_WAIT_TAIL 1 /* Also RCU_NEXT_READY head. */ | 123 | #define RCU_WAIT_TAIL 1 /* Also RCU_NEXT_READY head. */ |
| @@ -126,19 +147,22 @@ struct rcu_data { | |||
| 126 | * Any of the partitions might be empty, in which case the | 147 | * Any of the partitions might be empty, in which case the |
| 127 | * pointer to that partition will be equal to the pointer for | 148 | * pointer to that partition will be equal to the pointer for |
| 128 | * the following partition. When the list is empty, all of | 149 | * the following partition. When the list is empty, all of |
| 129 | * the nxttail elements point to nxtlist, which is NULL. | 150 | * the nxttail elements point to the ->nxtlist pointer itself, |
| 151 | * which in that case is NULL. | ||
| 130 | * | 152 | * |
| 131 | * [*nxttail[RCU_NEXT_READY_TAIL], NULL = *nxttail[RCU_NEXT_TAIL]): | ||
| 132 | * Entries that might have arrived after current GP ended | ||
| 133 | * [*nxttail[RCU_WAIT_TAIL], *nxttail[RCU_NEXT_READY_TAIL]): | ||
| 134 | * Entries known to have arrived before current GP ended | ||
| 135 | * [*nxttail[RCU_DONE_TAIL], *nxttail[RCU_WAIT_TAIL]): | ||
| 136 | * Entries that batch # <= ->completed - 1: waiting for current GP | ||
| 137 | * [nxtlist, *nxttail[RCU_DONE_TAIL]): | 153 | * [nxtlist, *nxttail[RCU_DONE_TAIL]): |
| 138 | * Entries that batch # <= ->completed | 154 | * Entries that batch # <= ->completed |
| 139 | * The grace period for these entries has completed, and | 155 | * The grace period for these entries has completed, and |
| 140 | * the other grace-period-completed entries may be moved | 156 | * the other grace-period-completed entries may be moved |
| 141 | * here temporarily in rcu_process_callbacks(). | 157 | * here temporarily in rcu_process_callbacks(). |
| 158 | * [*nxttail[RCU_DONE_TAIL], *nxttail[RCU_WAIT_TAIL]): | ||
| 159 | * Entries that batch # <= ->completed - 1: waiting for current GP | ||
| 160 | * [*nxttail[RCU_WAIT_TAIL], *nxttail[RCU_NEXT_READY_TAIL]): | ||
| 161 | * Entries known to have arrived before current GP ended | ||
| 162 | * [*nxttail[RCU_NEXT_READY_TAIL], *nxttail[RCU_NEXT_TAIL]): | ||
| 163 | * Entries that might have arrived after current GP ended | ||
| 164 | * Note that the value of *nxttail[RCU_NEXT_TAIL] will | ||
| 165 | * always be NULL, as this is the end of the list. | ||
| 142 | */ | 166 | */ |
| 143 | struct rcu_head *nxtlist; | 167 | struct rcu_head *nxtlist; |
| 144 | struct rcu_head **nxttail[RCU_NEXT_SIZE]; | 168 | struct rcu_head **nxttail[RCU_NEXT_SIZE]; |
| @@ -216,8 +240,19 @@ struct rcu_state { | |||
| 216 | /* Force QS state. */ | 240 | /* Force QS state. */ |
| 217 | long gpnum; /* Current gp number. */ | 241 | long gpnum; /* Current gp number. */ |
| 218 | long completed; /* # of last completed gp. */ | 242 | long completed; /* # of last completed gp. */ |
| 243 | |||
| 244 | /* End of fields guarded by root rcu_node's lock. */ | ||
| 245 | |||
| 219 | spinlock_t onofflock; /* exclude on/offline and */ | 246 | spinlock_t onofflock; /* exclude on/offline and */ |
| 220 | /* starting new GP. */ | 247 | /* starting new GP. Also */ |
| 248 | /* protects the following */ | ||
| 249 | /* orphan_cbs fields. */ | ||
| 250 | struct rcu_head *orphan_cbs_list; /* list of rcu_head structs */ | ||
| 251 | /* orphaned by all CPUs in */ | ||
| 252 | /* a given leaf rcu_node */ | ||
| 253 | /* going offline. */ | ||
| 254 | struct rcu_head **orphan_cbs_tail; /* And tail pointer. */ | ||
| 255 | long orphan_qlen; /* Number of orphaned cbs. */ | ||
| 221 | spinlock_t fqslock; /* Only one task forcing */ | 256 | spinlock_t fqslock; /* Only one task forcing */ |
| 222 | /* quiescent states. */ | 257 | /* quiescent states. */ |
| 223 | unsigned long jiffies_force_qs; /* Time at which to invoke */ | 258 | unsigned long jiffies_force_qs; /* Time at which to invoke */ |
| @@ -255,5 +290,30 @@ extern struct rcu_state rcu_preempt_state; | |||
| 255 | DECLARE_PER_CPU(struct rcu_data, rcu_preempt_data); | 290 | DECLARE_PER_CPU(struct rcu_data, rcu_preempt_data); |
| 256 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ | 291 | #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */ |
| 257 | 292 | ||
| 258 | #endif /* #ifdef RCU_TREE_NONCORE */ | 293 | #else /* #ifdef RCU_TREE_NONCORE */ |
| 294 | |||
| 295 | /* Forward declarations for rcutree_plugin.h */ | ||
| 296 | static inline void rcu_bootup_announce(void); | ||
| 297 | long rcu_batches_completed(void); | ||
| 298 | static void rcu_preempt_note_context_switch(int cpu); | ||
| 299 | static int rcu_preempted_readers(struct rcu_node *rnp); | ||
| 300 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | ||
| 301 | static void rcu_print_task_stall(struct rcu_node *rnp); | ||
| 302 | #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ | ||
| 303 | static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp); | ||
| 304 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 305 | static void rcu_preempt_offline_tasks(struct rcu_state *rsp, | ||
| 306 | struct rcu_node *rnp, | ||
| 307 | struct rcu_data *rdp); | ||
| 308 | static void rcu_preempt_offline_cpu(int cpu); | ||
| 309 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 310 | static void rcu_preempt_check_callbacks(int cpu); | ||
| 311 | static void rcu_preempt_process_callbacks(void); | ||
| 312 | void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)); | ||
| 313 | static int rcu_preempt_pending(int cpu); | ||
| 314 | static int rcu_preempt_needs_cpu(int cpu); | ||
| 315 | static void __cpuinit rcu_preempt_init_percpu_data(int cpu); | ||
| 316 | static void rcu_preempt_send_cbs_to_orphanage(void); | ||
| 317 | static void __init __rcu_init_preempt(void); | ||
| 259 | 318 | ||
| 319 | #endif /* #else #ifdef RCU_TREE_NONCORE */ | ||
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 1cee04f627eb..c0cb783aa16a 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
| @@ -150,6 +150,16 @@ void __rcu_read_lock(void) | |||
| 150 | } | 150 | } |
| 151 | EXPORT_SYMBOL_GPL(__rcu_read_lock); | 151 | EXPORT_SYMBOL_GPL(__rcu_read_lock); |
| 152 | 152 | ||
| 153 | /* | ||
| 154 | * Check for preempted RCU readers blocking the current grace period | ||
| 155 | * for the specified rcu_node structure. If the caller needs a reliable | ||
| 156 | * answer, it must hold the rcu_node's ->lock. | ||
| 157 | */ | ||
| 158 | static int rcu_preempted_readers(struct rcu_node *rnp) | ||
| 159 | { | ||
| 160 | return !list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1]); | ||
| 161 | } | ||
| 162 | |||
| 153 | static void rcu_read_unlock_special(struct task_struct *t) | 163 | static void rcu_read_unlock_special(struct task_struct *t) |
| 154 | { | 164 | { |
| 155 | int empty; | 165 | int empty; |
| @@ -196,7 +206,7 @@ static void rcu_read_unlock_special(struct task_struct *t) | |||
| 196 | break; | 206 | break; |
| 197 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ | 207 | spin_unlock(&rnp->lock); /* irqs remain disabled. */ |
| 198 | } | 208 | } |
| 199 | empty = list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1]); | 209 | empty = !rcu_preempted_readers(rnp); |
| 200 | list_del_init(&t->rcu_node_entry); | 210 | list_del_init(&t->rcu_node_entry); |
| 201 | t->rcu_blocked_node = NULL; | 211 | t->rcu_blocked_node = NULL; |
| 202 | 212 | ||
| @@ -207,7 +217,7 @@ static void rcu_read_unlock_special(struct task_struct *t) | |||
| 207 | * drop rnp->lock and restore irq. | 217 | * drop rnp->lock and restore irq. |
| 208 | */ | 218 | */ |
| 209 | if (!empty && rnp->qsmask == 0 && | 219 | if (!empty && rnp->qsmask == 0 && |
| 210 | list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1])) { | 220 | !rcu_preempted_readers(rnp)) { |
| 211 | struct rcu_node *rnp_p; | 221 | struct rcu_node *rnp_p; |
| 212 | 222 | ||
| 213 | if (rnp->parent == NULL) { | 223 | if (rnp->parent == NULL) { |
| @@ -257,12 +267,12 @@ static void rcu_print_task_stall(struct rcu_node *rnp) | |||
| 257 | { | 267 | { |
| 258 | unsigned long flags; | 268 | unsigned long flags; |
| 259 | struct list_head *lp; | 269 | struct list_head *lp; |
| 260 | int phase = rnp->gpnum & 0x1; | 270 | int phase; |
| 261 | struct task_struct *t; | 271 | struct task_struct *t; |
| 262 | 272 | ||
| 263 | if (!list_empty(&rnp->blocked_tasks[phase])) { | 273 | if (rcu_preempted_readers(rnp)) { |
| 264 | spin_lock_irqsave(&rnp->lock, flags); | 274 | spin_lock_irqsave(&rnp->lock, flags); |
| 265 | phase = rnp->gpnum & 0x1; /* re-read under lock. */ | 275 | phase = rnp->gpnum & 0x1; |
| 266 | lp = &rnp->blocked_tasks[phase]; | 276 | lp = &rnp->blocked_tasks[phase]; |
| 267 | list_for_each_entry(t, lp, rcu_node_entry) | 277 | list_for_each_entry(t, lp, rcu_node_entry) |
| 268 | printk(" P%d", t->pid); | 278 | printk(" P%d", t->pid); |
| @@ -281,20 +291,10 @@ static void rcu_print_task_stall(struct rcu_node *rnp) | |||
| 281 | */ | 291 | */ |
| 282 | static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) | 292 | static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) |
| 283 | { | 293 | { |
| 284 | WARN_ON_ONCE(!list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1])); | 294 | WARN_ON_ONCE(rcu_preempted_readers(rnp)); |
| 285 | WARN_ON_ONCE(rnp->qsmask); | 295 | WARN_ON_ONCE(rnp->qsmask); |
| 286 | } | 296 | } |
| 287 | 297 | ||
| 288 | /* | ||
| 289 | * Check for preempted RCU readers for the specified rcu_node structure. | ||
| 290 | * If the caller needs a reliable answer, it must hold the rcu_node's | ||
| 291 | * >lock. | ||
| 292 | */ | ||
| 293 | static int rcu_preempted_readers(struct rcu_node *rnp) | ||
| 294 | { | ||
| 295 | return !list_empty(&rnp->blocked_tasks[rnp->gpnum & 0x1]); | ||
| 296 | } | ||
| 297 | |||
| 298 | #ifdef CONFIG_HOTPLUG_CPU | 298 | #ifdef CONFIG_HOTPLUG_CPU |
| 299 | 299 | ||
| 300 | /* | 300 | /* |
| @@ -410,6 +410,15 @@ static int rcu_preempt_needs_cpu(int cpu) | |||
| 410 | return !!per_cpu(rcu_preempt_data, cpu).nxtlist; | 410 | return !!per_cpu(rcu_preempt_data, cpu).nxtlist; |
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | /** | ||
| 414 | * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete. | ||
| 415 | */ | ||
| 416 | void rcu_barrier(void) | ||
| 417 | { | ||
| 418 | _rcu_barrier(&rcu_preempt_state, call_rcu); | ||
| 419 | } | ||
| 420 | EXPORT_SYMBOL_GPL(rcu_barrier); | ||
| 421 | |||
| 413 | /* | 422 | /* |
| 414 | * Initialize preemptable RCU's per-CPU data. | 423 | * Initialize preemptable RCU's per-CPU data. |
| 415 | */ | 424 | */ |
| @@ -419,6 +428,22 @@ static void __cpuinit rcu_preempt_init_percpu_data(int cpu) | |||
| 419 | } | 428 | } |
| 420 | 429 | ||
| 421 | /* | 430 | /* |
| 431 | * Move preemptable RCU's callbacks to ->orphan_cbs_list. | ||
| 432 | */ | ||
| 433 | static void rcu_preempt_send_cbs_to_orphanage(void) | ||
| 434 | { | ||
| 435 | rcu_send_cbs_to_orphanage(&rcu_preempt_state); | ||
| 436 | } | ||
| 437 | |||
| 438 | /* | ||
| 439 | * Initialize preemptable RCU's state structures. | ||
| 440 | */ | ||
| 441 | static void __init __rcu_init_preempt(void) | ||
| 442 | { | ||
| 443 | RCU_INIT_FLAVOR(&rcu_preempt_state, rcu_preempt_data); | ||
| 444 | } | ||
| 445 | |||
| 446 | /* | ||
| 422 | * Check for a task exiting while in a preemptable-RCU read-side | 447 | * Check for a task exiting while in a preemptable-RCU read-side |
| 423 | * critical section, clean up if so. No need to issue warnings, | 448 | * critical section, clean up if so. No need to issue warnings, |
| 424 | * as debug_check_no_locks_held() already does this if lockdep | 449 | * as debug_check_no_locks_held() already does this if lockdep |
| @@ -461,6 +486,15 @@ static void rcu_preempt_note_context_switch(int cpu) | |||
| 461 | { | 486 | { |
| 462 | } | 487 | } |
| 463 | 488 | ||
| 489 | /* | ||
| 490 | * Because preemptable RCU does not exist, there are never any preempted | ||
| 491 | * RCU readers. | ||
| 492 | */ | ||
| 493 | static int rcu_preempted_readers(struct rcu_node *rnp) | ||
| 494 | { | ||
| 495 | return 0; | ||
| 496 | } | ||
| 497 | |||
| 464 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR | 498 | #ifdef CONFIG_RCU_CPU_STALL_DETECTOR |
| 465 | 499 | ||
| 466 | /* | 500 | /* |
| @@ -483,15 +517,6 @@ static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp) | |||
| 483 | WARN_ON_ONCE(rnp->qsmask); | 517 | WARN_ON_ONCE(rnp->qsmask); |
| 484 | } | 518 | } |
| 485 | 519 | ||
| 486 | /* | ||
| 487 | * Because preemptable RCU does not exist, there are never any preempted | ||
| 488 | * RCU readers. | ||
| 489 | */ | ||
| 490 | static int rcu_preempted_readers(struct rcu_node *rnp) | ||
| 491 | { | ||
| 492 | return 0; | ||
| 493 | } | ||
| 494 | |||
| 495 | #ifdef CONFIG_HOTPLUG_CPU | 520 | #ifdef CONFIG_HOTPLUG_CPU |
| 496 | 521 | ||
| 497 | /* | 522 | /* |
| @@ -518,7 +543,7 @@ static void rcu_preempt_offline_cpu(int cpu) | |||
| 518 | * Because preemptable RCU does not exist, it never has any callbacks | 543 | * Because preemptable RCU does not exist, it never has any callbacks |
| 519 | * to check. | 544 | * to check. |
| 520 | */ | 545 | */ |
| 521 | void rcu_preempt_check_callbacks(int cpu) | 546 | static void rcu_preempt_check_callbacks(int cpu) |
| 522 | { | 547 | { |
| 523 | } | 548 | } |
| 524 | 549 | ||
| @@ -526,7 +551,7 @@ void rcu_preempt_check_callbacks(int cpu) | |||
| 526 | * Because preemptable RCU does not exist, it never has any callbacks | 551 | * Because preemptable RCU does not exist, it never has any callbacks |
| 527 | * to process. | 552 | * to process. |
| 528 | */ | 553 | */ |
| 529 | void rcu_preempt_process_callbacks(void) | 554 | static void rcu_preempt_process_callbacks(void) |
| 530 | { | 555 | { |
| 531 | } | 556 | } |
| 532 | 557 | ||
| @@ -556,6 +581,16 @@ static int rcu_preempt_needs_cpu(int cpu) | |||
| 556 | } | 581 | } |
| 557 | 582 | ||
| 558 | /* | 583 | /* |
| 584 | * Because preemptable RCU does not exist, rcu_barrier() is just | ||
| 585 | * another name for rcu_barrier_sched(). | ||
| 586 | */ | ||
| 587 | void rcu_barrier(void) | ||
| 588 | { | ||
| 589 | rcu_barrier_sched(); | ||
| 590 | } | ||
| 591 | EXPORT_SYMBOL_GPL(rcu_barrier); | ||
| 592 | |||
| 593 | /* | ||
| 559 | * Because preemptable RCU does not exist, there is no per-CPU | 594 | * Because preemptable RCU does not exist, there is no per-CPU |
| 560 | * data to initialize. | 595 | * data to initialize. |
| 561 | */ | 596 | */ |
| @@ -563,4 +598,18 @@ static void __cpuinit rcu_preempt_init_percpu_data(int cpu) | |||
| 563 | { | 598 | { |
| 564 | } | 599 | } |
| 565 | 600 | ||
| 601 | /* | ||
| 602 | * Because there is no preemptable RCU, there are no callbacks to move. | ||
| 603 | */ | ||
| 604 | static void rcu_preempt_send_cbs_to_orphanage(void) | ||
| 605 | { | ||
| 606 | } | ||
| 607 | |||
| 608 | /* | ||
| 609 | * Because preemptable RCU does not exist, it need not be initialized. | ||
| 610 | */ | ||
| 611 | static void __init __rcu_init_preempt(void) | ||
| 612 | { | ||
| 613 | } | ||
| 614 | |||
| 566 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ | 615 | #endif /* #else #ifdef CONFIG_TREE_PREEMPT_RCU */ |
diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c index 179e6ad80dc0..4b31c779e62e 100644 --- a/kernel/rcutree_trace.c +++ b/kernel/rcutree_trace.c | |||
| @@ -159,13 +159,13 @@ static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp) | |||
| 159 | struct rcu_node *rnp; | 159 | struct rcu_node *rnp; |
| 160 | 160 | ||
| 161 | seq_printf(m, "c=%ld g=%ld s=%d jfq=%ld j=%x " | 161 | seq_printf(m, "c=%ld g=%ld s=%d jfq=%ld j=%x " |
| 162 | "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu\n", | 162 | "nfqs=%lu/nfqsng=%lu(%lu) fqlh=%lu oqlen=%ld\n", |
| 163 | rsp->completed, rsp->gpnum, rsp->signaled, | 163 | rsp->completed, rsp->gpnum, rsp->signaled, |
| 164 | (long)(rsp->jiffies_force_qs - jiffies), | 164 | (long)(rsp->jiffies_force_qs - jiffies), |
| 165 | (int)(jiffies & 0xffff), | 165 | (int)(jiffies & 0xffff), |
| 166 | rsp->n_force_qs, rsp->n_force_qs_ngp, | 166 | rsp->n_force_qs, rsp->n_force_qs_ngp, |
| 167 | rsp->n_force_qs - rsp->n_force_qs_ngp, | 167 | rsp->n_force_qs - rsp->n_force_qs_ngp, |
| 168 | rsp->n_force_qs_lh); | 168 | rsp->n_force_qs_lh, rsp->orphan_qlen); |
| 169 | for (rnp = &rsp->node[0]; rnp - &rsp->node[0] < NUM_RCU_NODES; rnp++) { | 169 | for (rnp = &rsp->node[0]; rnp - &rsp->node[0] < NUM_RCU_NODES; rnp++) { |
| 170 | if (rnp->level != level) { | 170 | if (rnp->level != level) { |
| 171 | seq_puts(m, "\n"); | 171 | seq_puts(m, "\n"); |
diff --git a/kernel/sched.c b/kernel/sched.c index 1535f3884b88..76c0e9691fc0 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -2515,22 +2515,17 @@ void sched_fork(struct task_struct *p, int clone_flags) | |||
| 2515 | __sched_fork(p); | 2515 | __sched_fork(p); |
| 2516 | 2516 | ||
| 2517 | /* | 2517 | /* |
| 2518 | * Make sure we do not leak PI boosting priority to the child. | ||
| 2519 | */ | ||
| 2520 | p->prio = current->normal_prio; | ||
| 2521 | |||
| 2522 | /* | ||
| 2523 | * Revert to default priority/policy on fork if requested. | 2518 | * Revert to default priority/policy on fork if requested. |
| 2524 | */ | 2519 | */ |
| 2525 | if (unlikely(p->sched_reset_on_fork)) { | 2520 | if (unlikely(p->sched_reset_on_fork)) { |
| 2526 | if (p->policy == SCHED_FIFO || p->policy == SCHED_RR) | 2521 | if (p->policy == SCHED_FIFO || p->policy == SCHED_RR) { |
| 2527 | p->policy = SCHED_NORMAL; | 2522 | p->policy = SCHED_NORMAL; |
| 2528 | 2523 | p->normal_prio = p->static_prio; | |
| 2529 | if (p->normal_prio < DEFAULT_PRIO) | 2524 | } |
| 2530 | p->prio = DEFAULT_PRIO; | ||
| 2531 | 2525 | ||
| 2532 | if (PRIO_TO_NICE(p->static_prio) < 0) { | 2526 | if (PRIO_TO_NICE(p->static_prio) < 0) { |
| 2533 | p->static_prio = NICE_TO_PRIO(0); | 2527 | p->static_prio = NICE_TO_PRIO(0); |
| 2528 | p->normal_prio = p->static_prio; | ||
| 2534 | set_load_weight(p); | 2529 | set_load_weight(p); |
| 2535 | } | 2530 | } |
| 2536 | 2531 | ||
| @@ -2541,6 +2536,11 @@ void sched_fork(struct task_struct *p, int clone_flags) | |||
| 2541 | p->sched_reset_on_fork = 0; | 2536 | p->sched_reset_on_fork = 0; |
| 2542 | } | 2537 | } |
| 2543 | 2538 | ||
| 2539 | /* | ||
| 2540 | * Make sure we do not leak PI boosting priority to the child. | ||
| 2541 | */ | ||
| 2542 | p->prio = current->normal_prio; | ||
| 2543 | |||
| 2544 | if (!rt_prio(p->prio)) | 2544 | if (!rt_prio(p->prio)) |
| 2545 | p->sched_class = &fair_sched_class; | 2545 | p->sched_class = &fair_sched_class; |
| 2546 | 2546 | ||
| @@ -2581,8 +2581,6 @@ void wake_up_new_task(struct task_struct *p, unsigned long clone_flags) | |||
| 2581 | BUG_ON(p->state != TASK_RUNNING); | 2581 | BUG_ON(p->state != TASK_RUNNING); |
| 2582 | update_rq_clock(rq); | 2582 | update_rq_clock(rq); |
| 2583 | 2583 | ||
| 2584 | p->prio = effective_prio(p); | ||
| 2585 | |||
| 2586 | if (!p->sched_class->task_new || !current->se.on_rq) { | 2584 | if (!p->sched_class->task_new || !current->se.on_rq) { |
| 2587 | activate_task(rq, p, 0); | 2585 | activate_task(rq, p, 0); |
| 2588 | } else { | 2586 | } else { |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index e0f59a21c061..89aed5933ed4 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -231,6 +231,13 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 231 | if (!inidle && !ts->inidle) | 231 | if (!inidle && !ts->inidle) |
| 232 | goto end; | 232 | goto end; |
| 233 | 233 | ||
| 234 | /* | ||
| 235 | * Set ts->inidle unconditionally. Even if the system did not | ||
| 236 | * switch to NOHZ mode the cpu frequency governers rely on the | ||
| 237 | * update of the idle time accounting in tick_nohz_start_idle(). | ||
| 238 | */ | ||
| 239 | ts->inidle = 1; | ||
| 240 | |||
| 234 | now = tick_nohz_start_idle(ts); | 241 | now = tick_nohz_start_idle(ts); |
| 235 | 242 | ||
| 236 | /* | 243 | /* |
| @@ -248,8 +255,6 @@ void tick_nohz_stop_sched_tick(int inidle) | |||
| 248 | if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) | 255 | if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) |
| 249 | goto end; | 256 | goto end; |
| 250 | 257 | ||
| 251 | ts->inidle = 1; | ||
| 252 | |||
| 253 | if (need_resched()) | 258 | if (need_resched()) |
| 254 | goto end; | 259 | goto end; |
| 255 | 260 | ||
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 3724756e41ca..37ba67e33265 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -1078,14 +1078,9 @@ static void ftrace_replace_code(int enable) | |||
| 1078 | failed = __ftrace_replace_code(rec, enable); | 1078 | failed = __ftrace_replace_code(rec, enable); |
| 1079 | if (failed) { | 1079 | if (failed) { |
| 1080 | rec->flags |= FTRACE_FL_FAILED; | 1080 | rec->flags |= FTRACE_FL_FAILED; |
| 1081 | if ((system_state == SYSTEM_BOOTING) || | 1081 | ftrace_bug(failed, rec->ip); |
| 1082 | !core_kernel_text(rec->ip)) { | 1082 | /* Stop processing */ |
| 1083 | ftrace_free_rec(rec); | 1083 | return; |
| 1084 | } else { | ||
| 1085 | ftrace_bug(failed, rec->ip); | ||
| 1086 | /* Stop processing */ | ||
| 1087 | return; | ||
| 1088 | } | ||
| 1089 | } | 1084 | } |
| 1090 | } while_for_each_ftrace_rec(); | 1085 | } while_for_each_ftrace_rec(); |
| 1091 | } | 1086 | } |
| @@ -2662,19 +2657,17 @@ static int ftrace_convert_nops(struct module *mod, | |||
| 2662 | } | 2657 | } |
| 2663 | 2658 | ||
| 2664 | #ifdef CONFIG_MODULES | 2659 | #ifdef CONFIG_MODULES |
| 2665 | void ftrace_release(void *start, void *end) | 2660 | void ftrace_release_mod(struct module *mod) |
| 2666 | { | 2661 | { |
| 2667 | struct dyn_ftrace *rec; | 2662 | struct dyn_ftrace *rec; |
| 2668 | struct ftrace_page *pg; | 2663 | struct ftrace_page *pg; |
| 2669 | unsigned long s = (unsigned long)start; | ||
| 2670 | unsigned long e = (unsigned long)end; | ||
| 2671 | 2664 | ||
| 2672 | if (ftrace_disabled || !start || start == end) | 2665 | if (ftrace_disabled) |
| 2673 | return; | 2666 | return; |
| 2674 | 2667 | ||
| 2675 | mutex_lock(&ftrace_lock); | 2668 | mutex_lock(&ftrace_lock); |
| 2676 | do_for_each_ftrace_rec(pg, rec) { | 2669 | do_for_each_ftrace_rec(pg, rec) { |
| 2677 | if ((rec->ip >= s) && (rec->ip < e)) { | 2670 | if (within_module_core(rec->ip, mod)) { |
| 2678 | /* | 2671 | /* |
| 2679 | * rec->ip is changed in ftrace_free_rec() | 2672 | * rec->ip is changed in ftrace_free_rec() |
| 2680 | * It should not between s and e if record was freed. | 2673 | * It should not between s and e if record was freed. |
| @@ -2706,9 +2699,7 @@ static int ftrace_module_notify(struct notifier_block *self, | |||
| 2706 | mod->num_ftrace_callsites); | 2699 | mod->num_ftrace_callsites); |
| 2707 | break; | 2700 | break; |
| 2708 | case MODULE_STATE_GOING: | 2701 | case MODULE_STATE_GOING: |
| 2709 | ftrace_release(mod->ftrace_callsites, | 2702 | ftrace_release_mod(mod); |
| 2710 | mod->ftrace_callsites + | ||
| 2711 | mod->num_ftrace_callsites); | ||
| 2712 | break; | 2703 | break; |
| 2713 | } | 2704 | } |
| 2714 | 2705 | ||
diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index 7a7a9fd249a9..4a194f08f88c 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c | |||
| @@ -34,6 +34,7 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
| 34 | struct trace_array *tr = branch_tracer; | 34 | struct trace_array *tr = branch_tracer; |
| 35 | struct ring_buffer_event *event; | 35 | struct ring_buffer_event *event; |
| 36 | struct trace_branch *entry; | 36 | struct trace_branch *entry; |
| 37 | struct ring_buffer *buffer; | ||
| 37 | unsigned long flags; | 38 | unsigned long flags; |
| 38 | int cpu, pc; | 39 | int cpu, pc; |
| 39 | const char *p; | 40 | const char *p; |
| @@ -54,7 +55,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
| 54 | goto out; | 55 | goto out; |
| 55 | 56 | ||
| 56 | pc = preempt_count(); | 57 | pc = preempt_count(); |
| 57 | event = trace_buffer_lock_reserve(tr, TRACE_BRANCH, | 58 | buffer = tr->buffer; |
| 59 | event = trace_buffer_lock_reserve(buffer, TRACE_BRANCH, | ||
| 58 | sizeof(*entry), flags, pc); | 60 | sizeof(*entry), flags, pc); |
| 59 | if (!event) | 61 | if (!event) |
| 60 | goto out; | 62 | goto out; |
| @@ -74,8 +76,8 @@ probe_likely_condition(struct ftrace_branch_data *f, int val, int expect) | |||
| 74 | entry->line = f->line; | 76 | entry->line = f->line; |
| 75 | entry->correct = val == expect; | 77 | entry->correct = val == expect; |
| 76 | 78 | ||
| 77 | if (!filter_check_discard(call, entry, tr->buffer, event)) | 79 | if (!filter_check_discard(call, entry, buffer, event)) |
| 78 | ring_buffer_unlock_commit(tr->buffer, event); | 80 | ring_buffer_unlock_commit(buffer, event); |
| 79 | 81 | ||
| 80 | out: | 82 | out: |
| 81 | atomic_dec(&tr->data[cpu]->disabled); | 83 | atomic_dec(&tr->data[cpu]->disabled); |
diff --git a/kernel/trace/trace_event_profile.c b/kernel/trace/trace_event_profile.c index dd44b8768867..8d5c171cc998 100644 --- a/kernel/trace/trace_event_profile.c +++ b/kernel/trace/trace_event_profile.c | |||
| @@ -31,7 +31,7 @@ static int ftrace_profile_enable_event(struct ftrace_event_call *event) | |||
| 31 | if (atomic_inc_return(&event->profile_count)) | 31 | if (atomic_inc_return(&event->profile_count)) |
| 32 | return 0; | 32 | return 0; |
| 33 | 33 | ||
| 34 | if (!total_profile_count++) { | 34 | if (!total_profile_count) { |
| 35 | buf = (char *)alloc_percpu(profile_buf_t); | 35 | buf = (char *)alloc_percpu(profile_buf_t); |
| 36 | if (!buf) | 36 | if (!buf) |
| 37 | goto fail_buf; | 37 | goto fail_buf; |
| @@ -46,14 +46,19 @@ static int ftrace_profile_enable_event(struct ftrace_event_call *event) | |||
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | ret = event->profile_enable(); | 48 | ret = event->profile_enable(); |
| 49 | if (!ret) | 49 | if (!ret) { |
| 50 | total_profile_count++; | ||
| 50 | return 0; | 51 | return 0; |
| 52 | } | ||
| 51 | 53 | ||
| 52 | kfree(trace_profile_buf_nmi); | ||
| 53 | fail_buf_nmi: | 54 | fail_buf_nmi: |
| 54 | kfree(trace_profile_buf); | 55 | if (!total_profile_count) { |
| 56 | free_percpu(trace_profile_buf_nmi); | ||
| 57 | free_percpu(trace_profile_buf); | ||
| 58 | trace_profile_buf_nmi = NULL; | ||
| 59 | trace_profile_buf = NULL; | ||
| 60 | } | ||
| 55 | fail_buf: | 61 | fail_buf: |
| 56 | total_profile_count--; | ||
| 57 | atomic_dec(&event->profile_count); | 62 | atomic_dec(&event->profile_count); |
| 58 | 63 | ||
| 59 | return ret; | 64 | return ret; |
diff --git a/kernel/trace/trace_hw_branches.c b/kernel/trace/trace_hw_branches.c index 23b63859130e..69543a905cd5 100644 --- a/kernel/trace/trace_hw_branches.c +++ b/kernel/trace/trace_hw_branches.c | |||
| @@ -165,6 +165,7 @@ void trace_hw_branch(u64 from, u64 to) | |||
| 165 | struct ftrace_event_call *call = &event_hw_branch; | 165 | struct ftrace_event_call *call = &event_hw_branch; |
| 166 | struct trace_array *tr = hw_branch_trace; | 166 | struct trace_array *tr = hw_branch_trace; |
| 167 | struct ring_buffer_event *event; | 167 | struct ring_buffer_event *event; |
| 168 | struct ring_buffer *buf; | ||
| 168 | struct hw_branch_entry *entry; | 169 | struct hw_branch_entry *entry; |
| 169 | unsigned long irq1; | 170 | unsigned long irq1; |
| 170 | int cpu; | 171 | int cpu; |
| @@ -180,7 +181,8 @@ void trace_hw_branch(u64 from, u64 to) | |||
| 180 | if (atomic_inc_return(&tr->data[cpu]->disabled) != 1) | 181 | if (atomic_inc_return(&tr->data[cpu]->disabled) != 1) |
| 181 | goto out; | 182 | goto out; |
| 182 | 183 | ||
| 183 | event = trace_buffer_lock_reserve(tr, TRACE_HW_BRANCHES, | 184 | buf = tr->buffer; |
| 185 | event = trace_buffer_lock_reserve(buf, TRACE_HW_BRANCHES, | ||
| 184 | sizeof(*entry), 0, 0); | 186 | sizeof(*entry), 0, 0); |
| 185 | if (!event) | 187 | if (!event) |
| 186 | goto out; | 188 | goto out; |
| @@ -189,8 +191,8 @@ void trace_hw_branch(u64 from, u64 to) | |||
| 189 | entry->ent.type = TRACE_HW_BRANCHES; | 191 | entry->ent.type = TRACE_HW_BRANCHES; |
| 190 | entry->from = from; | 192 | entry->from = from; |
| 191 | entry->to = to; | 193 | entry->to = to; |
| 192 | if (!filter_check_discard(call, entry, tr->buffer, event)) | 194 | if (!filter_check_discard(call, entry, buf, event)) |
| 193 | trace_buffer_unlock_commit(tr, event, 0, 0); | 195 | trace_buffer_unlock_commit(buf, event, 0, 0); |
| 194 | 196 | ||
| 195 | out: | 197 | out: |
| 196 | atomic_dec(&tr->data[cpu]->disabled); | 198 | atomic_dec(&tr->data[cpu]->disabled); |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index f572f44c6e1e..ed17565826b0 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
| @@ -486,16 +486,18 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) | |||
| 486 | hardirq ? 'h' : softirq ? 's' : '.')) | 486 | hardirq ? 'h' : softirq ? 's' : '.')) |
| 487 | return 0; | 487 | return 0; |
| 488 | 488 | ||
| 489 | if (entry->lock_depth < 0) | 489 | if (entry->preempt_count) |
| 490 | ret = trace_seq_putc(s, '.'); | 490 | ret = trace_seq_printf(s, "%x", entry->preempt_count); |
| 491 | else | 491 | else |
| 492 | ret = trace_seq_printf(s, "%d", entry->lock_depth); | 492 | ret = trace_seq_putc(s, '.'); |
| 493 | |||
| 493 | if (!ret) | 494 | if (!ret) |
| 494 | return 0; | 495 | return 0; |
| 495 | 496 | ||
| 496 | if (entry->preempt_count) | 497 | if (entry->lock_depth < 0) |
| 497 | return trace_seq_printf(s, "%x", entry->preempt_count); | 498 | return trace_seq_putc(s, '.'); |
| 498 | return trace_seq_putc(s, '.'); | 499 | |
| 500 | return trace_seq_printf(s, "%d", entry->lock_depth); | ||
| 499 | } | 501 | } |
| 500 | 502 | ||
| 501 | static int | 503 | static int |
| @@ -883,7 +885,7 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S) | |||
| 883 | trace_assign_type(field, iter->ent); | 885 | trace_assign_type(field, iter->ent); |
| 884 | 886 | ||
| 885 | if (!S) | 887 | if (!S) |
| 886 | task_state_char(field->prev_state); | 888 | S = task_state_char(field->prev_state); |
| 887 | T = task_state_char(field->next_state); | 889 | T = task_state_char(field->next_state); |
| 888 | if (!trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n", | 890 | if (!trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n", |
| 889 | field->prev_pid, | 891 | field->prev_pid, |
| @@ -918,7 +920,7 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S) | |||
| 918 | trace_assign_type(field, iter->ent); | 920 | trace_assign_type(field, iter->ent); |
| 919 | 921 | ||
| 920 | if (!S) | 922 | if (!S) |
| 921 | task_state_char(field->prev_state); | 923 | S = task_state_char(field->prev_state); |
| 922 | T = task_state_char(field->next_state); | 924 | T = task_state_char(field->next_state); |
| 923 | 925 | ||
| 924 | SEQ_PUT_HEX_FIELD_RET(s, field->prev_pid); | 926 | SEQ_PUT_HEX_FIELD_RET(s, field->prev_pid); |
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 9fbce6c9d2e1..527e17eae575 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -166,7 +166,7 @@ int syscall_exit_format(struct ftrace_event_call *call, struct trace_seq *s) | |||
| 166 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" | 166 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n" |
| 167 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n", | 167 | "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n", |
| 168 | SYSCALL_FIELD(int, nr), | 168 | SYSCALL_FIELD(int, nr), |
| 169 | SYSCALL_FIELD(unsigned long, ret)); | 169 | SYSCALL_FIELD(long, ret)); |
| 170 | if (!ret) | 170 | if (!ret) |
| 171 | return 0; | 171 | return 0; |
| 172 | 172 | ||
| @@ -212,7 +212,7 @@ int syscall_exit_define_fields(struct ftrace_event_call *call) | |||
| 212 | if (ret) | 212 | if (ret) |
| 213 | return ret; | 213 | return ret; |
| 214 | 214 | ||
| 215 | ret = trace_define_field(call, SYSCALL_FIELD(unsigned long, ret), 0, | 215 | ret = trace_define_field(call, SYSCALL_FIELD(long, ret), 0, |
| 216 | FILTER_OTHER); | 216 | FILTER_OTHER); |
| 217 | 217 | ||
| 218 | return ret; | 218 | return ret; |
diff --git a/mm/Kconfig b/mm/Kconfig index edd300aca173..57963c6063d1 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
| @@ -224,7 +224,9 @@ config KSM | |||
| 224 | the many instances by a single resident page with that content, so | 224 | the many instances by a single resident page with that content, so |
| 225 | saving memory until one or another app needs to modify the content. | 225 | saving memory until one or another app needs to modify the content. |
| 226 | Recommended for use with KVM, or with other duplicative applications. | 226 | Recommended for use with KVM, or with other duplicative applications. |
| 227 | See Documentation/vm/ksm.txt for more information. | 227 | See Documentation/vm/ksm.txt for more information: KSM is inactive |
| 228 | until a program has madvised that an area is MADV_MERGEABLE, and | ||
| 229 | root has set /sys/kernel/mm/ksm/run to 1 (if CONFIG_SYSFS is set). | ||
| 228 | 230 | ||
| 229 | config DEFAULT_MMAP_MIN_ADDR | 231 | config DEFAULT_MMAP_MIN_ADDR |
| 230 | int "Low address space to protect from user allocation" | 232 | int "Low address space to protect from user allocation" |
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 4ea4510e2996..8bf765c4f58d 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c | |||
| @@ -833,12 +833,15 @@ static void early_alloc(struct early_log *log) | |||
| 833 | */ | 833 | */ |
| 834 | rcu_read_lock(); | 834 | rcu_read_lock(); |
| 835 | object = create_object((unsigned long)log->ptr, log->size, | 835 | object = create_object((unsigned long)log->ptr, log->size, |
| 836 | log->min_count, GFP_KERNEL); | 836 | log->min_count, GFP_ATOMIC); |
| 837 | if (!object) | ||
| 838 | goto out; | ||
| 837 | spin_lock_irqsave(&object->lock, flags); | 839 | spin_lock_irqsave(&object->lock, flags); |
| 838 | for (i = 0; i < log->trace_len; i++) | 840 | for (i = 0; i < log->trace_len; i++) |
| 839 | object->trace[i] = log->trace[i]; | 841 | object->trace[i] = log->trace[i]; |
| 840 | object->trace_len = log->trace_len; | 842 | object->trace_len = log->trace_len; |
| 841 | spin_unlock_irqrestore(&object->lock, flags); | 843 | spin_unlock_irqrestore(&object->lock, flags); |
| 844 | out: | ||
| 842 | rcu_read_unlock(); | 845 | rcu_read_unlock(); |
| 843 | } | 846 | } |
| 844 | 847 | ||
| @@ -184,11 +184,6 @@ static DEFINE_SPINLOCK(ksm_mmlist_lock); | |||
| 184 | sizeof(struct __struct), __alignof__(struct __struct),\ | 184 | sizeof(struct __struct), __alignof__(struct __struct),\ |
| 185 | (__flags), NULL) | 185 | (__flags), NULL) |
| 186 | 186 | ||
| 187 | static void __init ksm_init_max_kernel_pages(void) | ||
| 188 | { | ||
| 189 | ksm_max_kernel_pages = nr_free_buffer_pages() / 4; | ||
| 190 | } | ||
| 191 | |||
| 192 | static int __init ksm_slab_init(void) | 187 | static int __init ksm_slab_init(void) |
| 193 | { | 188 | { |
| 194 | rmap_item_cache = KSM_KMEM_CACHE(rmap_item, 0); | 189 | rmap_item_cache = KSM_KMEM_CACHE(rmap_item, 0); |
| @@ -1673,7 +1668,7 @@ static int __init ksm_init(void) | |||
| 1673 | struct task_struct *ksm_thread; | 1668 | struct task_struct *ksm_thread; |
| 1674 | int err; | 1669 | int err; |
| 1675 | 1670 | ||
| 1676 | ksm_init_max_kernel_pages(); | 1671 | ksm_max_kernel_pages = totalram_pages / 4; |
| 1677 | 1672 | ||
| 1678 | err = ksm_slab_init(); | 1673 | err = ksm_slab_init(); |
| 1679 | if (err) | 1674 | if (err) |
| @@ -1697,6 +1692,9 @@ static int __init ksm_init(void) | |||
| 1697 | kthread_stop(ksm_thread); | 1692 | kthread_stop(ksm_thread); |
| 1698 | goto out_free2; | 1693 | goto out_free2; |
| 1699 | } | 1694 | } |
| 1695 | #else | ||
| 1696 | ksm_run = KSM_RUN_MERGE; /* no way for user to start it */ | ||
| 1697 | |||
| 1700 | #endif /* CONFIG_SYSFS */ | 1698 | #endif /* CONFIG_SYSFS */ |
| 1701 | 1699 | ||
| 1702 | return 0; | 1700 | return 0; |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 69511e663234..5e7aed0802bf 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -25,10 +25,10 @@ | |||
| 25 | #include <linux/rcupdate.h> | 25 | #include <linux/rcupdate.h> |
| 26 | #include <linux/pfn.h> | 26 | #include <linux/pfn.h> |
| 27 | #include <linux/kmemleak.h> | 27 | #include <linux/kmemleak.h> |
| 28 | #include <linux/highmem.h> | ||
| 29 | #include <asm/atomic.h> | 28 | #include <asm/atomic.h> |
| 30 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
| 31 | #include <asm/tlbflush.h> | 30 | #include <asm/tlbflush.h> |
| 31 | #include <asm/shmparam.h> | ||
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | /*** Page table manipulation functions ***/ | 34 | /*** Page table manipulation functions ***/ |
| @@ -1156,12 +1156,11 @@ static void insert_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, | |||
| 1156 | } | 1156 | } |
| 1157 | 1157 | ||
| 1158 | static struct vm_struct *__get_vm_area_node(unsigned long size, | 1158 | static struct vm_struct *__get_vm_area_node(unsigned long size, |
| 1159 | unsigned long flags, unsigned long start, unsigned long end, | 1159 | unsigned long align, unsigned long flags, unsigned long start, |
| 1160 | int node, gfp_t gfp_mask, void *caller) | 1160 | unsigned long end, int node, gfp_t gfp_mask, void *caller) |
| 1161 | { | 1161 | { |
| 1162 | static struct vmap_area *va; | 1162 | static struct vmap_area *va; |
| 1163 | struct vm_struct *area; | 1163 | struct vm_struct *area; |
| 1164 | unsigned long align = 1; | ||
| 1165 | 1164 | ||
| 1166 | BUG_ON(in_interrupt()); | 1165 | BUG_ON(in_interrupt()); |
| 1167 | if (flags & VM_IOREMAP) { | 1166 | if (flags & VM_IOREMAP) { |
| @@ -1201,7 +1200,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, | |||
| 1201 | struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, | 1200 | struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, |
| 1202 | unsigned long start, unsigned long end) | 1201 | unsigned long start, unsigned long end) |
| 1203 | { | 1202 | { |
| 1204 | return __get_vm_area_node(size, flags, start, end, -1, GFP_KERNEL, | 1203 | return __get_vm_area_node(size, 1, flags, start, end, -1, GFP_KERNEL, |
| 1205 | __builtin_return_address(0)); | 1204 | __builtin_return_address(0)); |
| 1206 | } | 1205 | } |
| 1207 | EXPORT_SYMBOL_GPL(__get_vm_area); | 1206 | EXPORT_SYMBOL_GPL(__get_vm_area); |
| @@ -1210,7 +1209,7 @@ struct vm_struct *__get_vm_area_caller(unsigned long size, unsigned long flags, | |||
| 1210 | unsigned long start, unsigned long end, | 1209 | unsigned long start, unsigned long end, |
| 1211 | void *caller) | 1210 | void *caller) |
| 1212 | { | 1211 | { |
| 1213 | return __get_vm_area_node(size, flags, start, end, -1, GFP_KERNEL, | 1212 | return __get_vm_area_node(size, 1, flags, start, end, -1, GFP_KERNEL, |
| 1214 | caller); | 1213 | caller); |
| 1215 | } | 1214 | } |
| 1216 | 1215 | ||
| @@ -1225,22 +1224,22 @@ struct vm_struct *__get_vm_area_caller(unsigned long size, unsigned long flags, | |||
| 1225 | */ | 1224 | */ |
| 1226 | struct vm_struct *get_vm_area(unsigned long size, unsigned long flags) | 1225 | struct vm_struct *get_vm_area(unsigned long size, unsigned long flags) |
| 1227 | { | 1226 | { |
| 1228 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, | 1227 | return __get_vm_area_node(size, 1, flags, VMALLOC_START, VMALLOC_END, |
| 1229 | -1, GFP_KERNEL, __builtin_return_address(0)); | 1228 | -1, GFP_KERNEL, __builtin_return_address(0)); |
| 1230 | } | 1229 | } |
| 1231 | 1230 | ||
| 1232 | struct vm_struct *get_vm_area_caller(unsigned long size, unsigned long flags, | 1231 | struct vm_struct *get_vm_area_caller(unsigned long size, unsigned long flags, |
| 1233 | void *caller) | 1232 | void *caller) |
| 1234 | { | 1233 | { |
| 1235 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, | 1234 | return __get_vm_area_node(size, 1, flags, VMALLOC_START, VMALLOC_END, |
| 1236 | -1, GFP_KERNEL, caller); | 1235 | -1, GFP_KERNEL, caller); |
| 1237 | } | 1236 | } |
| 1238 | 1237 | ||
| 1239 | struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, | 1238 | struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, |
| 1240 | int node, gfp_t gfp_mask) | 1239 | int node, gfp_t gfp_mask) |
| 1241 | { | 1240 | { |
| 1242 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, node, | 1241 | return __get_vm_area_node(size, 1, flags, VMALLOC_START, VMALLOC_END, |
| 1243 | gfp_mask, __builtin_return_address(0)); | 1242 | node, gfp_mask, __builtin_return_address(0)); |
| 1244 | } | 1243 | } |
| 1245 | 1244 | ||
| 1246 | static struct vm_struct *find_vm_area(const void *addr) | 1245 | static struct vm_struct *find_vm_area(const void *addr) |
| @@ -1403,7 +1402,8 @@ void *vmap(struct page **pages, unsigned int count, | |||
| 1403 | } | 1402 | } |
| 1404 | EXPORT_SYMBOL(vmap); | 1403 | EXPORT_SYMBOL(vmap); |
| 1405 | 1404 | ||
| 1406 | static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | 1405 | static void *__vmalloc_node(unsigned long size, unsigned long align, |
| 1406 | gfp_t gfp_mask, pgprot_t prot, | ||
| 1407 | int node, void *caller); | 1407 | int node, void *caller); |
| 1408 | static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, | 1408 | static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, |
| 1409 | pgprot_t prot, int node, void *caller) | 1409 | pgprot_t prot, int node, void *caller) |
| @@ -1417,7 +1417,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask, | |||
| 1417 | area->nr_pages = nr_pages; | 1417 | area->nr_pages = nr_pages; |
| 1418 | /* Please note that the recursion is strictly bounded. */ | 1418 | /* Please note that the recursion is strictly bounded. */ |
| 1419 | if (array_size > PAGE_SIZE) { | 1419 | if (array_size > PAGE_SIZE) { |
| 1420 | pages = __vmalloc_node(array_size, gfp_mask | __GFP_ZERO, | 1420 | pages = __vmalloc_node(array_size, 1, gfp_mask | __GFP_ZERO, |
| 1421 | PAGE_KERNEL, node, caller); | 1421 | PAGE_KERNEL, node, caller); |
| 1422 | area->flags |= VM_VPAGES; | 1422 | area->flags |= VM_VPAGES; |
| 1423 | } else { | 1423 | } else { |
| @@ -1476,6 +1476,7 @@ void *__vmalloc_area(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot) | |||
| 1476 | /** | 1476 | /** |
| 1477 | * __vmalloc_node - allocate virtually contiguous memory | 1477 | * __vmalloc_node - allocate virtually contiguous memory |
| 1478 | * @size: allocation size | 1478 | * @size: allocation size |
| 1479 | * @align: desired alignment | ||
| 1479 | * @gfp_mask: flags for the page level allocator | 1480 | * @gfp_mask: flags for the page level allocator |
| 1480 | * @prot: protection mask for the allocated pages | 1481 | * @prot: protection mask for the allocated pages |
| 1481 | * @node: node to use for allocation or -1 | 1482 | * @node: node to use for allocation or -1 |
| @@ -1485,8 +1486,9 @@ void *__vmalloc_area(struct vm_struct *area, gfp_t gfp_mask, pgprot_t prot) | |||
| 1485 | * allocator with @gfp_mask flags. Map them into contiguous | 1486 | * allocator with @gfp_mask flags. Map them into contiguous |
| 1486 | * kernel virtual space, using a pagetable protection of @prot. | 1487 | * kernel virtual space, using a pagetable protection of @prot. |
| 1487 | */ | 1488 | */ |
| 1488 | static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | 1489 | static void *__vmalloc_node(unsigned long size, unsigned long align, |
| 1489 | int node, void *caller) | 1490 | gfp_t gfp_mask, pgprot_t prot, |
| 1491 | int node, void *caller) | ||
| 1490 | { | 1492 | { |
| 1491 | struct vm_struct *area; | 1493 | struct vm_struct *area; |
| 1492 | void *addr; | 1494 | void *addr; |
| @@ -1496,8 +1498,8 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | |||
| 1496 | if (!size || (size >> PAGE_SHIFT) > totalram_pages) | 1498 | if (!size || (size >> PAGE_SHIFT) > totalram_pages) |
| 1497 | return NULL; | 1499 | return NULL; |
| 1498 | 1500 | ||
| 1499 | area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END, | 1501 | area = __get_vm_area_node(size, align, VM_ALLOC, VMALLOC_START, |
| 1500 | node, gfp_mask, caller); | 1502 | VMALLOC_END, node, gfp_mask, caller); |
| 1501 | 1503 | ||
| 1502 | if (!area) | 1504 | if (!area) |
| 1503 | return NULL; | 1505 | return NULL; |
| @@ -1516,7 +1518,7 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | |||
| 1516 | 1518 | ||
| 1517 | void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) | 1519 | void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) |
| 1518 | { | 1520 | { |
| 1519 | return __vmalloc_node(size, gfp_mask, prot, -1, | 1521 | return __vmalloc_node(size, 1, gfp_mask, prot, -1, |
| 1520 | __builtin_return_address(0)); | 1522 | __builtin_return_address(0)); |
| 1521 | } | 1523 | } |
| 1522 | EXPORT_SYMBOL(__vmalloc); | 1524 | EXPORT_SYMBOL(__vmalloc); |
| @@ -1532,7 +1534,7 @@ EXPORT_SYMBOL(__vmalloc); | |||
| 1532 | */ | 1534 | */ |
| 1533 | void *vmalloc(unsigned long size) | 1535 | void *vmalloc(unsigned long size) |
| 1534 | { | 1536 | { |
| 1535 | return __vmalloc_node(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, | 1537 | return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, |
| 1536 | -1, __builtin_return_address(0)); | 1538 | -1, __builtin_return_address(0)); |
| 1537 | } | 1539 | } |
| 1538 | EXPORT_SYMBOL(vmalloc); | 1540 | EXPORT_SYMBOL(vmalloc); |
| @@ -1549,7 +1551,8 @@ void *vmalloc_user(unsigned long size) | |||
| 1549 | struct vm_struct *area; | 1551 | struct vm_struct *area; |
| 1550 | void *ret; | 1552 | void *ret; |
| 1551 | 1553 | ||
| 1552 | ret = __vmalloc_node(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, | 1554 | ret = __vmalloc_node(size, SHMLBA, |
| 1555 | GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, | ||
| 1553 | PAGE_KERNEL, -1, __builtin_return_address(0)); | 1556 | PAGE_KERNEL, -1, __builtin_return_address(0)); |
| 1554 | if (ret) { | 1557 | if (ret) { |
| 1555 | area = find_vm_area(ret); | 1558 | area = find_vm_area(ret); |
| @@ -1572,7 +1575,7 @@ EXPORT_SYMBOL(vmalloc_user); | |||
| 1572 | */ | 1575 | */ |
| 1573 | void *vmalloc_node(unsigned long size, int node) | 1576 | void *vmalloc_node(unsigned long size, int node) |
| 1574 | { | 1577 | { |
| 1575 | return __vmalloc_node(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, | 1578 | return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL, |
| 1576 | node, __builtin_return_address(0)); | 1579 | node, __builtin_return_address(0)); |
| 1577 | } | 1580 | } |
| 1578 | EXPORT_SYMBOL(vmalloc_node); | 1581 | EXPORT_SYMBOL(vmalloc_node); |
| @@ -1595,7 +1598,7 @@ EXPORT_SYMBOL(vmalloc_node); | |||
| 1595 | 1598 | ||
| 1596 | void *vmalloc_exec(unsigned long size) | 1599 | void *vmalloc_exec(unsigned long size) |
| 1597 | { | 1600 | { |
| 1598 | return __vmalloc_node(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC, | 1601 | return __vmalloc_node(size, 1, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC, |
| 1599 | -1, __builtin_return_address(0)); | 1602 | -1, __builtin_return_address(0)); |
| 1600 | } | 1603 | } |
| 1601 | 1604 | ||
| @@ -1616,7 +1619,7 @@ void *vmalloc_exec(unsigned long size) | |||
| 1616 | */ | 1619 | */ |
| 1617 | void *vmalloc_32(unsigned long size) | 1620 | void *vmalloc_32(unsigned long size) |
| 1618 | { | 1621 | { |
| 1619 | return __vmalloc_node(size, GFP_VMALLOC32, PAGE_KERNEL, | 1622 | return __vmalloc_node(size, 1, GFP_VMALLOC32, PAGE_KERNEL, |
| 1620 | -1, __builtin_return_address(0)); | 1623 | -1, __builtin_return_address(0)); |
| 1621 | } | 1624 | } |
| 1622 | EXPORT_SYMBOL(vmalloc_32); | 1625 | EXPORT_SYMBOL(vmalloc_32); |
| @@ -1633,7 +1636,7 @@ void *vmalloc_32_user(unsigned long size) | |||
| 1633 | struct vm_struct *area; | 1636 | struct vm_struct *area; |
| 1634 | void *ret; | 1637 | void *ret; |
| 1635 | 1638 | ||
| 1636 | ret = __vmalloc_node(size, GFP_VMALLOC32 | __GFP_ZERO, PAGE_KERNEL, | 1639 | ret = __vmalloc_node(size, 1, GFP_VMALLOC32 | __GFP_ZERO, PAGE_KERNEL, |
| 1637 | -1, __builtin_return_address(0)); | 1640 | -1, __builtin_return_address(0)); |
| 1638 | if (ret) { | 1641 | if (ret) { |
| 1639 | area = find_vm_area(ret); | 1642 | area = find_vm_area(ret); |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 821d30918cfc..427ded841224 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -366,13 +366,13 @@ static ssize_t wireless_show(struct device *d, char *buf, | |||
| 366 | const struct iw_statistics *iw; | 366 | const struct iw_statistics *iw; |
| 367 | ssize_t ret = -EINVAL; | 367 | ssize_t ret = -EINVAL; |
| 368 | 368 | ||
| 369 | read_lock(&dev_base_lock); | 369 | rtnl_lock(); |
| 370 | if (dev_isalive(dev)) { | 370 | if (dev_isalive(dev)) { |
| 371 | iw = get_wireless_stats(dev); | 371 | iw = get_wireless_stats(dev); |
| 372 | if (iw) | 372 | if (iw) |
| 373 | ret = (*format)(iw, buf); | 373 | ret = (*format)(iw, buf); |
| 374 | } | 374 | } |
| 375 | read_unlock(&dev_base_lock); | 375 | rtnl_unlock(); |
| 376 | 376 | ||
| 377 | return ret; | 377 | return ret; |
| 378 | } | 378 | } |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index b69455217ed6..86acdba0a97d 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -964,7 +964,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 964 | if (value == 0x7FFFFFFF) | 964 | if (value == 0x7FFFFFFF) |
| 965 | pkt_dev->delay = ULLONG_MAX; | 965 | pkt_dev->delay = ULLONG_MAX; |
| 966 | else | 966 | else |
| 967 | pkt_dev->delay = (u64)value * NSEC_PER_USEC; | 967 | pkt_dev->delay = (u64)value; |
| 968 | 968 | ||
| 969 | sprintf(pg_result, "OK: delay=%llu", | 969 | sprintf(pg_result, "OK: delay=%llu", |
| 970 | (unsigned long long) pkt_dev->delay); | 970 | (unsigned long long) pkt_dev->delay); |
| @@ -2212,7 +2212,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev) | |||
| 2212 | if (pkt_dev->flags & F_QUEUE_MAP_CPU) | 2212 | if (pkt_dev->flags & F_QUEUE_MAP_CPU) |
| 2213 | pkt_dev->cur_queue_map = smp_processor_id(); | 2213 | pkt_dev->cur_queue_map = smp_processor_id(); |
| 2214 | 2214 | ||
| 2215 | else if (pkt_dev->queue_map_min < pkt_dev->queue_map_max) { | 2215 | else if (pkt_dev->queue_map_min <= pkt_dev->queue_map_max) { |
| 2216 | __u16 t; | 2216 | __u16 t; |
| 2217 | if (pkt_dev->flags & F_QUEUE_MAP_RND) { | 2217 | if (pkt_dev->flags & F_QUEUE_MAP_RND) { |
| 2218 | t = random32() % | 2218 | t = random32() % |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index e92f1fd28aa5..5df2f6a0b0f0 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1077,12 +1077,16 @@ static int inetdev_event(struct notifier_block *this, unsigned long event, | |||
| 1077 | ip_mc_up(in_dev); | 1077 | ip_mc_up(in_dev); |
| 1078 | /* fall through */ | 1078 | /* fall through */ |
| 1079 | case NETDEV_CHANGEADDR: | 1079 | case NETDEV_CHANGEADDR: |
| 1080 | if (IN_DEV_ARP_NOTIFY(in_dev)) | 1080 | /* Send gratuitous ARP to notify of link change */ |
| 1081 | arp_send(ARPOP_REQUEST, ETH_P_ARP, | 1081 | if (IN_DEV_ARP_NOTIFY(in_dev)) { |
| 1082 | in_dev->ifa_list->ifa_address, | 1082 | struct in_ifaddr *ifa = in_dev->ifa_list; |
| 1083 | dev, | 1083 | |
| 1084 | in_dev->ifa_list->ifa_address, | 1084 | if (ifa) |
| 1085 | NULL, dev->dev_addr, NULL); | 1085 | arp_send(ARPOP_REQUEST, ETH_P_ARP, |
| 1086 | ifa->ifa_address, dev, | ||
| 1087 | ifa->ifa_address, NULL, | ||
| 1088 | dev->dev_addr, NULL); | ||
| 1089 | } | ||
| 1086 | break; | 1090 | break; |
| 1087 | case NETDEV_DOWN: | 1091 | case NETDEV_DOWN: |
| 1088 | ip_mc_down(in_dev); | 1092 | ip_mc_down(in_dev); |
diff --git a/sound/drivers/opl3/opl3_midi.c b/sound/drivers/opl3/opl3_midi.c index 6e7d09ae0e82..7d722a025d0d 100644 --- a/sound/drivers/opl3/opl3_midi.c +++ b/sound/drivers/opl3/opl3_midi.c | |||
| @@ -29,6 +29,8 @@ extern char snd_opl3_regmap[MAX_OPL2_VOICES][4]; | |||
| 29 | 29 | ||
| 30 | extern int use_internal_drums; | 30 | extern int use_internal_drums; |
| 31 | 31 | ||
| 32 | static void snd_opl3_note_off_unsafe(void *p, int note, int vel, | ||
| 33 | struct snd_midi_channel *chan); | ||
| 32 | /* | 34 | /* |
| 33 | * The next table looks magical, but it certainly is not. Its values have | 35 | * The next table looks magical, but it certainly is not. Its values have |
| 34 | * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception | 36 | * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception |
| @@ -242,16 +244,20 @@ void snd_opl3_timer_func(unsigned long data) | |||
| 242 | int again = 0; | 244 | int again = 0; |
| 243 | int i; | 245 | int i; |
| 244 | 246 | ||
| 245 | spin_lock_irqsave(&opl3->sys_timer_lock, flags); | 247 | spin_lock_irqsave(&opl3->voice_lock, flags); |
| 246 | for (i = 0; i < opl3->max_voices; i++) { | 248 | for (i = 0; i < opl3->max_voices; i++) { |
| 247 | struct snd_opl3_voice *vp = &opl3->voices[i]; | 249 | struct snd_opl3_voice *vp = &opl3->voices[i]; |
| 248 | if (vp->state > 0 && vp->note_off_check) { | 250 | if (vp->state > 0 && vp->note_off_check) { |
| 249 | if (vp->note_off == jiffies) | 251 | if (vp->note_off == jiffies) |
| 250 | snd_opl3_note_off(opl3, vp->note, 0, vp->chan); | 252 | snd_opl3_note_off_unsafe(opl3, vp->note, 0, |
| 253 | vp->chan); | ||
| 251 | else | 254 | else |
| 252 | again++; | 255 | again++; |
| 253 | } | 256 | } |
| 254 | } | 257 | } |
| 258 | spin_unlock_irqrestore(&opl3->voice_lock, flags); | ||
| 259 | |||
| 260 | spin_lock_irqsave(&opl3->sys_timer_lock, flags); | ||
| 255 | if (again) { | 261 | if (again) { |
| 256 | opl3->tlist.expires = jiffies + 1; /* invoke again */ | 262 | opl3->tlist.expires = jiffies + 1; /* invoke again */ |
| 257 | add_timer(&opl3->tlist); | 263 | add_timer(&opl3->tlist); |
| @@ -658,15 +664,14 @@ static void snd_opl3_kill_voice(struct snd_opl3 *opl3, int voice) | |||
| 658 | /* | 664 | /* |
| 659 | * Release a note in response to a midi note off. | 665 | * Release a note in response to a midi note off. |
| 660 | */ | 666 | */ |
| 661 | void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan) | 667 | static void snd_opl3_note_off_unsafe(void *p, int note, int vel, |
| 668 | struct snd_midi_channel *chan) | ||
| 662 | { | 669 | { |
| 663 | struct snd_opl3 *opl3; | 670 | struct snd_opl3 *opl3; |
| 664 | 671 | ||
| 665 | int voice; | 672 | int voice; |
| 666 | struct snd_opl3_voice *vp; | 673 | struct snd_opl3_voice *vp; |
| 667 | 674 | ||
| 668 | unsigned long flags; | ||
| 669 | |||
| 670 | opl3 = p; | 675 | opl3 = p; |
| 671 | 676 | ||
| 672 | #ifdef DEBUG_MIDI | 677 | #ifdef DEBUG_MIDI |
| @@ -674,12 +679,9 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan | |||
| 674 | chan->number, chan->midi_program, note); | 679 | chan->number, chan->midi_program, note); |
| 675 | #endif | 680 | #endif |
| 676 | 681 | ||
| 677 | spin_lock_irqsave(&opl3->voice_lock, flags); | ||
| 678 | |||
| 679 | if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { | 682 | if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { |
| 680 | if (chan->drum_channel && use_internal_drums) { | 683 | if (chan->drum_channel && use_internal_drums) { |
| 681 | snd_opl3_drum_switch(opl3, note, vel, 0, chan); | 684 | snd_opl3_drum_switch(opl3, note, vel, 0, chan); |
| 682 | spin_unlock_irqrestore(&opl3->voice_lock, flags); | ||
| 683 | return; | 685 | return; |
| 684 | } | 686 | } |
| 685 | /* this loop will hopefully kill all extra voices, because | 687 | /* this loop will hopefully kill all extra voices, because |
| @@ -697,6 +699,16 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan | |||
| 697 | snd_opl3_kill_voice(opl3, voice); | 699 | snd_opl3_kill_voice(opl3, voice); |
| 698 | } | 700 | } |
| 699 | } | 701 | } |
| 702 | } | ||
| 703 | |||
| 704 | void snd_opl3_note_off(void *p, int note, int vel, | ||
| 705 | struct snd_midi_channel *chan) | ||
| 706 | { | ||
| 707 | struct snd_opl3 *opl3 = p; | ||
| 708 | unsigned long flags; | ||
| 709 | |||
| 710 | spin_lock_irqsave(&opl3->voice_lock, flags); | ||
| 711 | snd_opl3_note_off_unsafe(p, note, vel, chan); | ||
| 700 | spin_unlock_irqrestore(&opl3->voice_lock, flags); | 712 | spin_unlock_irqrestore(&opl3->voice_lock, flags); |
| 701 | } | 713 | } |
| 702 | 714 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 7810d3dcad83..470fd74a0a1a 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1332,15 +1332,20 @@ do_sku: | |||
| 1332 | * when the external headphone out jack is plugged" | 1332 | * when the external headphone out jack is plugged" |
| 1333 | */ | 1333 | */ |
| 1334 | if (!spec->autocfg.hp_pins[0]) { | 1334 | if (!spec->autocfg.hp_pins[0]) { |
| 1335 | hda_nid_t nid; | ||
| 1335 | tmp = (ass >> 11) & 0x3; /* HP to chassis */ | 1336 | tmp = (ass >> 11) & 0x3; /* HP to chassis */ |
| 1336 | if (tmp == 0) | 1337 | if (tmp == 0) |
| 1337 | spec->autocfg.hp_pins[0] = porta; | 1338 | nid = porta; |
| 1338 | else if (tmp == 1) | 1339 | else if (tmp == 1) |
| 1339 | spec->autocfg.hp_pins[0] = porte; | 1340 | nid = porte; |
| 1340 | else if (tmp == 2) | 1341 | else if (tmp == 2) |
| 1341 | spec->autocfg.hp_pins[0] = portd; | 1342 | nid = portd; |
| 1342 | else | 1343 | else |
| 1343 | return 1; | 1344 | return 1; |
| 1345 | for (i = 0; i < spec->autocfg.line_outs; i++) | ||
| 1346 | if (spec->autocfg.line_out_pins[i] == nid) | ||
| 1347 | return 1; | ||
| 1348 | spec->autocfg.hp_pins[0] = nid; | ||
| 1344 | } | 1349 | } |
| 1345 | 1350 | ||
| 1346 | alc_init_auto_hp(codec); | 1351 | alc_init_auto_hp(codec); |
| @@ -1362,7 +1367,7 @@ static void alc_ssid_check(struct hda_codec *codec, | |||
| 1362 | } | 1367 | } |
| 1363 | 1368 | ||
| 1364 | /* | 1369 | /* |
| 1365 | * Fix-up pin default configurations | 1370 | * Fix-up pin default configurations and add default verbs |
| 1366 | */ | 1371 | */ |
| 1367 | 1372 | ||
| 1368 | struct alc_pincfg { | 1373 | struct alc_pincfg { |
| @@ -1370,9 +1375,14 @@ struct alc_pincfg { | |||
| 1370 | u32 val; | 1375 | u32 val; |
| 1371 | }; | 1376 | }; |
| 1372 | 1377 | ||
| 1373 | static void alc_fix_pincfg(struct hda_codec *codec, | 1378 | struct alc_fixup { |
| 1379 | const struct alc_pincfg *pins; | ||
| 1380 | const struct hda_verb *verbs; | ||
| 1381 | }; | ||
| 1382 | |||
| 1383 | static void alc_pick_fixup(struct hda_codec *codec, | ||
| 1374 | const struct snd_pci_quirk *quirk, | 1384 | const struct snd_pci_quirk *quirk, |
| 1375 | const struct alc_pincfg **pinfix) | 1385 | const struct alc_fixup *fix) |
| 1376 | { | 1386 | { |
| 1377 | const struct alc_pincfg *cfg; | 1387 | const struct alc_pincfg *cfg; |
| 1378 | 1388 | ||
| @@ -1380,9 +1390,14 @@ static void alc_fix_pincfg(struct hda_codec *codec, | |||
| 1380 | if (!quirk) | 1390 | if (!quirk) |
| 1381 | return; | 1391 | return; |
| 1382 | 1392 | ||
| 1383 | cfg = pinfix[quirk->value]; | 1393 | fix += quirk->value; |
| 1384 | for (; cfg->nid; cfg++) | 1394 | cfg = fix->pins; |
| 1385 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | 1395 | if (cfg) { |
| 1396 | for (; cfg->nid; cfg++) | ||
| 1397 | snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); | ||
| 1398 | } | ||
| 1399 | if (fix->verbs) | ||
| 1400 | add_verb(codec->spec, fix->verbs); | ||
| 1386 | } | 1401 | } |
| 1387 | 1402 | ||
| 1388 | /* | 1403 | /* |
| @@ -9593,11 +9608,13 @@ static struct alc_pincfg alc882_abit_aw9d_pinfix[] = { | |||
| 9593 | { } | 9608 | { } |
| 9594 | }; | 9609 | }; |
| 9595 | 9610 | ||
| 9596 | static const struct alc_pincfg *alc882_pin_fixes[] = { | 9611 | static const struct alc_fixup alc882_fixups[] = { |
| 9597 | [PINFIX_ABIT_AW9D_MAX] = alc882_abit_aw9d_pinfix, | 9612 | [PINFIX_ABIT_AW9D_MAX] = { |
| 9613 | .pins = alc882_abit_aw9d_pinfix | ||
| 9614 | }, | ||
| 9598 | }; | 9615 | }; |
| 9599 | 9616 | ||
| 9600 | static struct snd_pci_quirk alc882_pinfix_tbl[] = { | 9617 | static struct snd_pci_quirk alc882_fixup_tbl[] = { |
| 9601 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), | 9618 | SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), |
| 9602 | {} | 9619 | {} |
| 9603 | }; | 9620 | }; |
| @@ -9869,7 +9886,7 @@ static int patch_alc882(struct hda_codec *codec) | |||
| 9869 | board_config = ALC882_AUTO; | 9886 | board_config = ALC882_AUTO; |
| 9870 | } | 9887 | } |
| 9871 | 9888 | ||
| 9872 | alc_fix_pincfg(codec, alc882_pinfix_tbl, alc882_pin_fixes); | 9889 | alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups); |
| 9873 | 9890 | ||
| 9874 | if (board_config == ALC882_AUTO) { | 9891 | if (board_config == ALC882_AUTO) { |
| 9875 | /* automatic parse from the BIOS config */ | 9892 | /* automatic parse from the BIOS config */ |
| @@ -12842,12 +12859,15 @@ static int patch_alc268(struct hda_codec *codec) | |||
| 12842 | unsigned int wcap = get_wcaps(codec, 0x07); | 12859 | unsigned int wcap = get_wcaps(codec, 0x07); |
| 12843 | int i; | 12860 | int i; |
| 12844 | 12861 | ||
| 12862 | spec->capsrc_nids = alc268_capsrc_nids; | ||
| 12845 | /* get type */ | 12863 | /* get type */ |
| 12846 | wcap = get_wcaps_type(wcap); | 12864 | wcap = get_wcaps_type(wcap); |
| 12847 | if (spec->auto_mic || | 12865 | if (spec->auto_mic || |
| 12848 | wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { | 12866 | wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { |
| 12849 | spec->adc_nids = alc268_adc_nids_alt; | 12867 | spec->adc_nids = alc268_adc_nids_alt; |
| 12850 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); | 12868 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); |
| 12869 | if (spec->auto_mic) | ||
| 12870 | fixup_automic_adc(codec); | ||
| 12851 | if (spec->auto_mic || spec->input_mux->num_items == 1) | 12871 | if (spec->auto_mic || spec->input_mux->num_items == 1) |
| 12852 | add_mixer(spec, alc268_capture_nosrc_mixer); | 12872 | add_mixer(spec, alc268_capture_nosrc_mixer); |
| 12853 | else | 12873 | else |
| @@ -12857,7 +12877,6 @@ static int patch_alc268(struct hda_codec *codec) | |||
| 12857 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); | 12877 | spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids); |
| 12858 | add_mixer(spec, alc268_capture_mixer); | 12878 | add_mixer(spec, alc268_capture_mixer); |
| 12859 | } | 12879 | } |
| 12860 | spec->capsrc_nids = alc268_capsrc_nids; | ||
| 12861 | /* set default input source */ | 12880 | /* set default input source */ |
| 12862 | for (i = 0; i < spec->num_adc_nids; i++) | 12881 | for (i = 0; i < spec->num_adc_nids; i++) |
| 12863 | snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], | 12882 | snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], |
| @@ -14357,15 +14376,16 @@ static void alc861_auto_init_multi_out(struct hda_codec *codec) | |||
| 14357 | static void alc861_auto_init_hp_out(struct hda_codec *codec) | 14376 | static void alc861_auto_init_hp_out(struct hda_codec *codec) |
| 14358 | { | 14377 | { |
| 14359 | struct alc_spec *spec = codec->spec; | 14378 | struct alc_spec *spec = codec->spec; |
| 14360 | hda_nid_t pin; | ||
| 14361 | 14379 | ||
| 14362 | pin = spec->autocfg.hp_pins[0]; | 14380 | if (spec->autocfg.hp_outs) |
| 14363 | if (pin) | 14381 | alc861_auto_set_output_and_unmute(codec, |
| 14364 | alc861_auto_set_output_and_unmute(codec, pin, PIN_HP, | 14382 | spec->autocfg.hp_pins[0], |
| 14383 | PIN_HP, | ||
| 14365 | spec->multiout.hp_nid); | 14384 | spec->multiout.hp_nid); |
| 14366 | pin = spec->autocfg.speaker_pins[0]; | 14385 | if (spec->autocfg.speaker_outs) |
| 14367 | if (pin) | 14386 | alc861_auto_set_output_and_unmute(codec, |
| 14368 | alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT, | 14387 | spec->autocfg.speaker_pins[0], |
| 14388 | PIN_OUT, | ||
| 14369 | spec->multiout.dac_nids[0]); | 14389 | spec->multiout.dac_nids[0]); |
| 14370 | } | 14390 | } |
| 14371 | 14391 | ||
| @@ -15158,7 +15178,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = { | |||
| 15158 | SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), | 15178 | SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), |
| 15159 | SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), | 15179 | SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP), |
| 15160 | SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), | 15180 | SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), |
| 15161 | SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST), | 15181 | /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */ |
| 15162 | SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), | 15182 | SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S), |
| 15163 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), | 15183 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG), |
| 15164 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), | 15184 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), |
| @@ -15551,6 +15571,29 @@ static void alc861vd_auto_init(struct hda_codec *codec) | |||
| 15551 | alc_inithook(codec); | 15571 | alc_inithook(codec); |
| 15552 | } | 15572 | } |
| 15553 | 15573 | ||
| 15574 | enum { | ||
| 15575 | ALC660VD_FIX_ASUS_GPIO1 | ||
| 15576 | }; | ||
| 15577 | |||
| 15578 | /* reset GPIO1 */ | ||
| 15579 | static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = { | ||
| 15580 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, | ||
| 15581 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01}, | ||
| 15582 | {0x01, AC_VERB_SET_GPIO_DATA, 0x01}, | ||
| 15583 | { } | ||
| 15584 | }; | ||
| 15585 | |||
| 15586 | static const struct alc_fixup alc861vd_fixups[] = { | ||
| 15587 | [ALC660VD_FIX_ASUS_GPIO1] = { | ||
| 15588 | .verbs = alc660vd_fix_asus_gpio1_verbs, | ||
| 15589 | }, | ||
| 15590 | }; | ||
| 15591 | |||
| 15592 | static struct snd_pci_quirk alc861vd_fixup_tbl[] = { | ||
| 15593 | SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1), | ||
| 15594 | {} | ||
| 15595 | }; | ||
| 15596 | |||
| 15554 | static int patch_alc861vd(struct hda_codec *codec) | 15597 | static int patch_alc861vd(struct hda_codec *codec) |
| 15555 | { | 15598 | { |
| 15556 | struct alc_spec *spec; | 15599 | struct alc_spec *spec; |
| @@ -15572,6 +15615,8 @@ static int patch_alc861vd(struct hda_codec *codec) | |||
| 15572 | board_config = ALC861VD_AUTO; | 15615 | board_config = ALC861VD_AUTO; |
| 15573 | } | 15616 | } |
| 15574 | 15617 | ||
| 15618 | alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups); | ||
| 15619 | |||
| 15575 | if (board_config == ALC861VD_AUTO) { | 15620 | if (board_config == ALC861VD_AUTO) { |
| 15576 | /* automatic parse from the BIOS config */ | 15621 | /* automatic parse from the BIOS config */ |
| 15577 | err = alc861vd_parse_auto_config(codec); | 15622 | err = alc861vd_parse_auto_config(codec); |
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index cecf1ffeeaaa..d74033a2cfbe 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
| @@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol, | |||
| 2259 | } | 2259 | } |
| 2260 | 2260 | ||
| 2261 | static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { | 2261 | static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { |
| 2262 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2262 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
| 2263 | .name = "Multi Track Peak", | 2263 | .name = "Multi Track Peak", |
| 2264 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, | 2264 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, |
| 2265 | .info = snd_ice1712_pro_peak_info, | 2265 | .info = snd_ice1712_pro_peak_info, |
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index af6e00148621..76b717dae4b6 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c | |||
| @@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) | |||
| 1294 | 1294 | ||
| 1295 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 1295 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
| 1296 | snd_dma_pci_data(ice->pci), | 1296 | snd_dma_pci_data(ice->pci), |
| 1297 | 64*1024, 64*1024); | 1297 | 256*1024, 256*1024); |
| 1298 | 1298 | ||
| 1299 | ice->pcm = pcm; | 1299 | ice->pcm = pcm; |
| 1300 | 1300 | ||
| @@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) | |||
| 1408 | 1408 | ||
| 1409 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 1409 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
| 1410 | snd_dma_pci_data(ice->pci), | 1410 | snd_dma_pci_data(ice->pci), |
| 1411 | 64*1024, 64*1024); | 1411 | 256*1024, 256*1024); |
| 1412 | 1412 | ||
| 1413 | ice->pcm_ds = pcm; | 1413 | ice->pcm_ds = pcm; |
| 1414 | 1414 | ||
| @@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol, | |||
| 2110 | } | 2110 | } |
| 2111 | 2111 | ||
| 2112 | static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { | 2112 | static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { |
| 2113 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2113 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
| 2114 | .name = "Multi Track Peak", | 2114 | .name = "Multi Track Peak", |
| 2115 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, | 2115 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, |
| 2116 | .info = snd_vt1724_pro_peak_info, | 2116 | .info = snd_vt1724_pro_peak_info, |
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index acfa4760da49..91683a349035 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c | |||
| @@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol, | |||
| 1626 | struct snd_ctl_elem_value *ucontrol) | 1626 | struct snd_ctl_elem_value *ucontrol) |
| 1627 | { | 1627 | { |
| 1628 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); | 1628 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); |
| 1629 | unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); | 1629 | unsigned int idx = kcontrol->id.subdevice; |
| 1630 | 1630 | ||
| 1631 | ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; | 1631 | ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; |
| 1632 | ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; | 1632 | ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; |
| @@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol, | |||
| 1646 | struct snd_ctl_elem_value *ucontrol) | 1646 | struct snd_ctl_elem_value *ucontrol) |
| 1647 | { | 1647 | { |
| 1648 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); | 1648 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); |
| 1649 | unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); | 1649 | unsigned int idx = kcontrol->id.subdevice; |
| 1650 | unsigned long port = chip->port + 0x10 * idx; | 1650 | unsigned long port = chip->port + 0x10 * idx; |
| 1651 | unsigned char val; | 1651 | unsigned char val; |
| 1652 | int i, change = 0; | 1652 | int i, change = 0; |
| @@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata = | |||
| 1705 | }; | 1705 | }; |
| 1706 | 1706 | ||
| 1707 | static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { | 1707 | static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { |
| 1708 | .name = "VIA DXS Playback Volume", | 1708 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
| 1709 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1709 | .device = 0, |
| 1710 | /* .subdevice set later */ | ||
| 1711 | .name = "PCM Playback Volume", | ||
| 1710 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | | 1712 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | |
| 1711 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), | 1713 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), |
| 1712 | .count = 4, | ||
| 1713 | .info = snd_via8233_dxs_volume_info, | 1714 | .info = snd_via8233_dxs_volume_info, |
| 1714 | .get = snd_via8233_dxs_volume_get, | 1715 | .get = snd_via8233_dxs_volume_get, |
| 1715 | .put = snd_via8233_dxs_volume_put, | 1716 | .put = snd_via8233_dxs_volume_put, |
| @@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) | |||
| 1936 | } | 1937 | } |
| 1937 | else /* Using DXS when PCM emulation is enabled is really weird */ | 1938 | else /* Using DXS when PCM emulation is enabled is really weird */ |
| 1938 | { | 1939 | { |
| 1939 | /* Standalone DXS controls */ | 1940 | for (i = 0; i < 4; ++i) { |
| 1940 | err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); | 1941 | struct snd_kcontrol *kctl; |
| 1941 | if (err < 0) | 1942 | |
| 1942 | return err; | 1943 | kctl = snd_ctl_new1( |
| 1944 | &snd_via8233_dxs_volume_control, chip); | ||
| 1945 | if (!kctl) | ||
| 1946 | return -ENOMEM; | ||
| 1947 | kctl->id.subdevice = i; | ||
| 1948 | err = snd_ctl_add(chip->card, kctl); | ||
| 1949 | if (err < 0) | ||
| 1950 | return err; | ||
| 1951 | } | ||
| 1943 | } | 1952 | } |
| 1944 | } | 1953 | } |
| 1945 | /* select spdif data slot 10/11 */ | 1954 | /* select spdif data slot 10/11 */ |
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index 3ff0373dff89..593d5b9c9f03 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c | |||
| @@ -579,7 +579,7 @@ static const struct snd_kcontrol_new wm8350_left_capt_mixer_controls[] = { | |||
| 579 | SOC_DAPM_SINGLE_TLV("L3 Capture Volume", | 579 | SOC_DAPM_SINGLE_TLV("L3 Capture Volume", |
| 580 | WM8350_INPUT_MIXER_VOLUME_L, 9, 7, 0, out_mix_tlv), | 580 | WM8350_INPUT_MIXER_VOLUME_L, 9, 7, 0, out_mix_tlv), |
| 581 | SOC_DAPM_SINGLE("PGA Capture Switch", | 581 | SOC_DAPM_SINGLE("PGA Capture Switch", |
| 582 | WM8350_LEFT_INPUT_VOLUME, 14, 1, 0), | 582 | WM8350_LEFT_INPUT_VOLUME, 14, 1, 1), |
| 583 | }; | 583 | }; |
| 584 | 584 | ||
| 585 | /* Right Input Mixer */ | 585 | /* Right Input Mixer */ |
| @@ -589,7 +589,7 @@ static const struct snd_kcontrol_new wm8350_right_capt_mixer_controls[] = { | |||
| 589 | SOC_DAPM_SINGLE_TLV("L3 Capture Volume", | 589 | SOC_DAPM_SINGLE_TLV("L3 Capture Volume", |
| 590 | WM8350_INPUT_MIXER_VOLUME_R, 13, 7, 0, out_mix_tlv), | 590 | WM8350_INPUT_MIXER_VOLUME_R, 13, 7, 0, out_mix_tlv), |
| 591 | SOC_DAPM_SINGLE("PGA Capture Switch", | 591 | SOC_DAPM_SINGLE("PGA Capture Switch", |
| 592 | WM8350_RIGHT_INPUT_VOLUME, 14, 1, 0), | 592 | WM8350_RIGHT_INPUT_VOLUME, 14, 1, 1), |
| 593 | }; | 593 | }; |
| 594 | 594 | ||
| 595 | /* Left Mic Mixer */ | 595 | /* Left Mic Mixer */ |
diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c index da97aae475a2..1ef2454c5205 100644 --- a/sound/soc/codecs/wm8940.c +++ b/sound/soc/codecs/wm8940.c | |||
| @@ -790,7 +790,7 @@ static int wm8940_register(struct wm8940_priv *wm8940, | |||
| 790 | codec->reg_cache = &wm8940->reg_cache; | 790 | codec->reg_cache = &wm8940->reg_cache; |
| 791 | 791 | ||
| 792 | ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); | 792 | ret = snd_soc_codec_set_cache_io(codec, 8, 16, control); |
| 793 | if (ret == 0) { | 793 | if (ret < 0) { |
| 794 | dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); | 794 | dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); |
| 795 | return ret; | 795 | return ret; |
| 796 | } | 796 | } |
diff --git a/sound/soc/imx/mxc-ssi.c b/sound/soc/imx/mxc-ssi.c index 3806ff2c0cd4..ccdefe60e752 100644 --- a/sound/soc/imx/mxc-ssi.c +++ b/sound/soc/imx/mxc-ssi.c | |||
| @@ -397,14 +397,6 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 397 | break; | 397 | break; |
| 398 | } | 398 | } |
| 399 | 399 | ||
| 400 | /* sync */ | ||
| 401 | if (!(fmt & SND_SOC_DAIFMT_ASYNC)) | ||
| 402 | scr |= SSI_SCR_SYN; | ||
| 403 | |||
| 404 | /* tdm - only for stereo atm */ | ||
| 405 | if (fmt & SND_SOC_DAIFMT_TDM) | ||
| 406 | scr |= SSI_SCR_NET; | ||
| 407 | |||
| 408 | if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI2) { | 400 | if (cpu_dai->id == IMX_DAI_SSI0 || cpu_dai->id == IMX_DAI_SSI2) { |
| 409 | SSI1_STCR = stcr; | 401 | SSI1_STCR = stcr; |
| 410 | SSI1_SRCR = srcr; | 402 | SSI1_SRCR = srcr; |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index f79711b9fa5b..8de6f9dec4a2 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -524,7 +524,7 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget) | |||
| 524 | 524 | ||
| 525 | /* connected jack or spk ? */ | 525 | /* connected jack or spk ? */ |
| 526 | if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk || | 526 | if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk || |
| 527 | widget->id == snd_soc_dapm_line) | 527 | (widget->id == snd_soc_dapm_line && !list_empty(&widget->sources))) |
| 528 | return 1; | 528 | return 1; |
| 529 | } | 529 | } |
| 530 | 530 | ||
| @@ -573,7 +573,8 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget) | |||
| 573 | return 1; | 573 | return 1; |
| 574 | 574 | ||
| 575 | /* connected jack ? */ | 575 | /* connected jack ? */ |
| 576 | if (widget->id == snd_soc_dapm_mic || widget->id == snd_soc_dapm_line) | 576 | if (widget->id == snd_soc_dapm_mic || |
| 577 | (widget->id == snd_soc_dapm_line && !list_empty(&widget->sinks))) | ||
| 577 | return 1; | 578 | return 1; |
| 578 | } | 579 | } |
| 579 | 580 | ||
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a5a050af8e7d..3eeef339c787 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -41,6 +41,7 @@ static int raw_samples = 0; | |||
| 41 | static int system_wide = 0; | 41 | static int system_wide = 0; |
| 42 | static int profile_cpu = -1; | 42 | static int profile_cpu = -1; |
| 43 | static pid_t target_pid = -1; | 43 | static pid_t target_pid = -1; |
| 44 | static pid_t child_pid = -1; | ||
| 44 | static int inherit = 1; | 45 | static int inherit = 1; |
| 45 | static int force = 0; | 46 | static int force = 0; |
| 46 | static int append_file = 0; | 47 | static int append_file = 0; |
| @@ -184,6 +185,9 @@ static void sig_handler(int sig) | |||
| 184 | 185 | ||
| 185 | static void sig_atexit(void) | 186 | static void sig_atexit(void) |
| 186 | { | 187 | { |
| 188 | if (child_pid != -1) | ||
| 189 | kill(child_pid, SIGTERM); | ||
| 190 | |||
| 187 | if (signr == -1) | 191 | if (signr == -1) |
| 188 | return; | 192 | return; |
| 189 | 193 | ||
| @@ -610,6 +614,8 @@ static int __cmd_record(int argc, const char **argv) | |||
| 610 | exit(-1); | 614 | exit(-1); |
| 611 | } | 615 | } |
| 612 | } | 616 | } |
| 617 | |||
| 618 | child_pid = pid; | ||
| 613 | } | 619 | } |
| 614 | 620 | ||
| 615 | if (realtime_prio) { | 621 | if (realtime_prio) { |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index e5f6ece65a13..3db31e7bf173 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -69,7 +69,8 @@ static int run_idx = 0; | |||
| 69 | static int run_count = 1; | 69 | static int run_count = 1; |
| 70 | static int inherit = 1; | 70 | static int inherit = 1; |
| 71 | static int scale = 1; | 71 | static int scale = 1; |
| 72 | static int target_pid = -1; | 72 | static pid_t target_pid = -1; |
| 73 | static pid_t child_pid = -1; | ||
| 73 | static int null_run = 0; | 74 | static int null_run = 0; |
| 74 | 75 | ||
| 75 | static int fd[MAX_NR_CPUS][MAX_COUNTERS]; | 76 | static int fd[MAX_NR_CPUS][MAX_COUNTERS]; |
| @@ -285,6 +286,8 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
| 285 | exit(-1); | 286 | exit(-1); |
| 286 | } | 287 | } |
| 287 | 288 | ||
| 289 | child_pid = pid; | ||
| 290 | |||
| 288 | /* | 291 | /* |
| 289 | * Wait for the child to be ready to exec. | 292 | * Wait for the child to be ready to exec. |
| 290 | */ | 293 | */ |
| @@ -433,6 +436,9 @@ static void skip_signal(int signo) | |||
| 433 | 436 | ||
| 434 | static void sig_atexit(void) | 437 | static void sig_atexit(void) |
| 435 | { | 438 | { |
| 439 | if (child_pid != -1) | ||
| 440 | kill(child_pid, SIGTERM); | ||
| 441 | |||
| 436 | if (signr == -1) | 442 | if (signr == -1) |
| 437 | return; | 443 | return; |
| 438 | 444 | ||
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index e9d256e2f47d..0c5e4f72f2ba 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
| @@ -219,10 +219,6 @@ remap: | |||
| 219 | more: | 219 | more: |
| 220 | event = (event_t *)(buf + head); | 220 | event = (event_t *)(buf + head); |
| 221 | 221 | ||
| 222 | size = event->header.size; | ||
| 223 | if (!size) | ||
| 224 | size = 8; | ||
| 225 | |||
| 226 | if (head + event->header.size >= page_size * mmap_window) { | 222 | if (head + event->header.size >= page_size * mmap_window) { |
| 227 | unsigned long shift = page_size * (head / page_size); | 223 | unsigned long shift = page_size * (head / page_size); |
| 228 | int res; | 224 | int res; |
| @@ -237,7 +233,6 @@ more: | |||
| 237 | 233 | ||
| 238 | size = event->header.size; | 234 | size = event->header.size; |
| 239 | 235 | ||
| 240 | |||
| 241 | if (!size || process_event(event, offset, head) < 0) { | 236 | if (!size || process_event(event, offset, head) < 0) { |
| 242 | 237 | ||
| 243 | /* | 238 | /* |
| @@ -290,7 +285,6 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
| 290 | usage_with_options(annotate_usage, options); | 285 | usage_with_options(annotate_usage, options); |
| 291 | } | 286 | } |
| 292 | 287 | ||
| 293 | |||
| 294 | setup_pager(); | 288 | setup_pager(); |
| 295 | 289 | ||
| 296 | return __cmd_trace(); | 290 | return __cmd_trace(); |
diff --git a/tools/perf/design.txt b/tools/perf/design.txt index f1946d107b10..fdd42a824c98 100644 --- a/tools/perf/design.txt +++ b/tools/perf/design.txt | |||
| @@ -455,3 +455,6 @@ will need at least this: | |||
| 455 | 455 | ||
| 456 | If your architecture does have hardware capabilities, you can override the | 456 | If your architecture does have hardware capabilities, you can override the |
| 457 | weak stub hw_perf_event_init() to register hardware counters. | 457 | weak stub hw_perf_event_init() to register hardware counters. |
| 458 | |||
| 459 | Architectures that have d-cache aliassing issues, such as Sparc and ARM, | ||
| 460 | should select PERF_USE_VMALLOC in order to avoid these for perf mmap(). | ||
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 559fb06210f5..47ea0609a760 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -324,8 +324,7 @@ static inline int elf_sym__is_function(const GElf_Sym *sym) | |||
| 324 | { | 324 | { |
| 325 | return elf_sym__type(sym) == STT_FUNC && | 325 | return elf_sym__type(sym) == STT_FUNC && |
| 326 | sym->st_name != 0 && | 326 | sym->st_name != 0 && |
| 327 | sym->st_shndx != SHN_UNDEF && | 327 | sym->st_shndx != SHN_UNDEF; |
| 328 | sym->st_size != 0; | ||
| 329 | } | 328 | } |
| 330 | 329 | ||
| 331 | static inline int elf_sym__is_label(const GElf_Sym *sym) | 330 | static inline int elf_sym__is_label(const GElf_Sym *sym) |
diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index f6a8437141c8..55b41b9e3834 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c | |||
| @@ -1968,10 +1968,11 @@ static const struct flag flags[] = { | |||
| 1968 | { "NET_TX_SOFTIRQ", 2 }, | 1968 | { "NET_TX_SOFTIRQ", 2 }, |
| 1969 | { "NET_RX_SOFTIRQ", 3 }, | 1969 | { "NET_RX_SOFTIRQ", 3 }, |
| 1970 | { "BLOCK_SOFTIRQ", 4 }, | 1970 | { "BLOCK_SOFTIRQ", 4 }, |
| 1971 | { "TASKLET_SOFTIRQ", 5 }, | 1971 | { "BLOCK_IOPOLL_SOFTIRQ", 5 }, |
| 1972 | { "SCHED_SOFTIRQ", 6 }, | 1972 | { "TASKLET_SOFTIRQ", 6 }, |
| 1973 | { "HRTIMER_SOFTIRQ", 7 }, | 1973 | { "SCHED_SOFTIRQ", 7 }, |
| 1974 | { "RCU_SOFTIRQ", 8 }, | 1974 | { "HRTIMER_SOFTIRQ", 8 }, |
| 1975 | { "RCU_SOFTIRQ", 9 }, | ||
| 1975 | 1976 | ||
| 1976 | { "HRTIMER_NORESTART", 0 }, | 1977 | { "HRTIMER_NORESTART", 0 }, |
| 1977 | { "HRTIMER_RESTART", 1 }, | 1978 | { "HRTIMER_RESTART", 1 }, |
