aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/kcore.c
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2010-09-22 15:52:03 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2010-10-19 09:40:42 -0400
commit5c5456402d467969b217d7fdd6670f8c8600f5a8 (patch)
tree9b119bda25aa31242ab8692b473e0fa6dbea6882 /fs/proc/kcore.c
parent7caae3d71eae4f5307cae98131390e9d10627c01 (diff)
Litmus core: allow PRECISE_ENFORCEMENT2010.2
Allow all kinds of budget enforcement settings now that we have the supporting infrastructure.
Diffstat (limited to 'fs/proc/kcore.c')
0 files changed, 0 insertions, 0 deletions
3-24 04:04:11 -0400 committer Tejun Heo <tj@kernel.org> 2010-03-30 09:02:32 -0400 include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h' href='/cgit/cgit.cgi/litmus-rt-budgetable-locks.git/.git/commit/drivers/ata/ata_piix.c?h=update_litmus_2019&id=5a0e3ad6af8660be21ca98a971cd00f331318c05'>5a0e3ad6af86
1da177e4c3f4

b8b275efc28e
1da177e4c3f4

c611bed780a5
1da177e4c3f4




c72907245944



1da177e4c3f4
ff0fc1467f81
c72907245944
1da177e4c3f4
800b399669ad

b3362f88a8f9
5e5a4f5d5a08

1da177e4c3f4


d33f58b883a3





25985edcedea
d33f58b883a3

7b6dbd6872ca
b8b275efc28e


1da177e4c3f4

9cde9ed151e1






c611bed780a5
9cde9ed151e1

9c0bf6750548

9cde9ed151e1
9c0bf6750548

9cde9ed151e1
5e5a4f5d5a08
9cde9ed151e1

d33f58b883a3

73291a1cb68b
d33f58b883a3


d96715c1acb1

2852bcf7c12d
c72907245944
d96715c1acb1

2dcb407e6145

2852bcf7c12d
a1efdaba2dbd
2dcb407e6145


eb4a2c7f03db
25f98131a292
82ef04fb4c82



a97c40068fab

27943620cbd9
5e5a4f5d5a08
b8b275efc28e



1da177e4c3f4


3b7d697dfb7d
d2cdfc0db392

25f98131a292

669a5db411d8


669a5db411d8

















4bb969db48dd

669a5db411d8



2eb829e934ab
669a5db411d8

85cd7251b911
669a5db411d8



c611bed780a5

c1e6f28cc5de

1da177e4c3f4
7654db1a9256
4fca377f7488
1d076e5b8d91
1da177e4c3f4
1d076e5b8d91
1da177e4c3f4
1d076e5b8d91
5e56a37c3706
1d076e5b8d91
5e56a37c3706
1d076e5b8d91
1da177e4c3f4
1d076e5b8d91
9c0bf6750548
5016d7d212db


9c0bf6750548
1d076e5b8d91
9c0bf6750548
1d076e5b8d91
9c0bf6750548
f98b6573f190
9c0bf6750548
f98b6573f190
9c0bf6750548
f98b6573f190
00242ec87608
8d8ef2fb931d
9c0bf6750548
23cf296e3b04
487eff68e422
23cf296e3b04

f98b6573f190
9c0bf6750548
f98b6573f190
00242ec87608
f98b6573f190
00242ec87608
f98b6573f190
00242ec87608
f98b6573f190
00242ec87608
f98b6573f190
9c0bf6750548
c5cf0ffa71d3
9c0bf6750548
bf7f22b9cac7
9c0bf6750548
bf7f22b9cac7


9c0bf6750548
bf7f22b9cac7

c6c6a1afefe5


0395e61babd5

c6c6a1afefe5

0395e61babd5

c6c6a1afefe5


88e8201e67aa
5e5a4f5d5a08
88e8201e67aa
5e5a4f5d5a08
88e8201e67aa



238e149c7a92
5e5a4f5d5a08
238e149c7a92

4a836c701a0f
5e5a4f5d5a08
4a836c701a0f
5e5a4f5d5a08
4a836c701a0f



1da177e4c3f4






2852bcf7c12d
438ac6d5e3f8
b8b275efc28e

438ac6d5e3f8
1da177e4c3f4

193515d51ccb
68d1d07b510b
1da177e4c3f4

27943620cbd9
871af1210f13
27943620cbd9
5e5a4f5d5a08
27943620cbd9



029cfd6b74fc
1da177e4c3f4

a1efdaba2dbd
1da177e4c3f4

029cfd6b74fc


669a5db411d8

029cfd6b74fc



1da177e4c3f4

a97c40068fab









029cfd6b74fc

57c9efdfb3ce
c72907245944

a97c40068fab
c72907245944

d96715c1acb1
d33f58b883a3
ea35d29e2fa8
d33f58b883a3












d96715c1acb1
d33f58b883a3
ea35d29e2fa8
d33f58b883a3

79ea24e72e59
d33f58b883a3





d96715c1acb1
d33f58b883a3
ea35d29e2fa8
6708374178d2

c6446a4cdada

6708374178d2


e04b3b9d0347
6708374178d2





08f12edc335d

a0ce9aca97cc
08f12edc335d

158f30c8945f
08f12edc335d
ac2b04371fff
08f12edc335d



00242ec87608
e2d352af6d8f








c5cf0ffa71d3

8d8ef2fb931d











00242ec87608
8f73a6880183










d96715c1acb1

d96715c1acb1
9c0bf6750548

00242ec87608
9c0bf6750548

5e5a4f5d5a08
d96715c1acb1

1da177e4c3f4
00242ec87608

00242ec87608
14bdef982cae

00242ec87608


ec300d99ef86
1d076e5b8d91
b3362f88a8f9
14bdef982cae


1d076e5b8d91


ec300d99ef86
669a5db411d8
b3362f88a8f9
14bdef982cae


669a5db411d8

ec300d99ef86

1da177e4c3f4
b3362f88a8f9
14bdef982cae

669a5db411d8


85cd7251b911
ec300d99ef86
669a5db411d8
b3362f88a8f9
14bdef982cae


669a5db411d8
1da177e4c3f4

c611bed780a5








ec300d99ef86
1da177e4c3f4
228c1590be39
14bdef982cae

bf6263a853c9
1da177e4c3f4


ec300d99ef86
1da177e4c3f4
723159c58371
14bdef982cae

bf6263a853c9
1da177e4c3f4


9c0bf6750548
c368ca4ef471
5016d7d212db
14bdef982cae

bf6263a853c9
c368ca4ef471

1d076e5b8d91
9c0bf6750548
08f12edc335d
5016d7d212db
14bdef982cae

bf6263a853c9
08f12edc335d

669a5db411d8
00242ec87608
c5cf0ffa71d3
5016d7d212db
14bdef982cae

c5cf0ffa71d3


8f73a6880183
9c0bf6750548
8f73a6880183
5016d7d212db
14bdef982cae

8f73a6880183


8d8ef2fb931d
9c0bf6750548
8d8ef2fb931d
23cf296e3b04
14bdef982cae

8d8ef2fb931d



25f98131a292

25f98131a292
14bdef982cae


25f98131a292


5e5a4f5d5a08












1da177e4c3f4












fc085150b491












2655e2cee2d7
babfb682c93c
6034734d333c
1234010684bb
54174db300ee
af901ca181d9
d09addf65cb5
6034734d333c
b33620f9fa6a
e1fefea9cc4b

01ce2601e4ba
124a6eece386
fc085150b491



5e5a4f5d5a08







1da177e4c3f4
eb4a2c7f03db
1da177e4c3f4







669a5db411d8
eb4a2c7f03db
1da177e4c3f4
cca3974e4860
2852bcf7c12d
fc085150b491
2852bcf7c12d
1da177e4c3f4
fc085150b491



2dcb407e6145
eb4a2c7f03db
2dcb407e6145
fc085150b491


1da177e4c3f4
2a88d1ac8dca
2852bcf7c12d
eb4a2c7f03db

1da177e4c3f4


ccc4672aff18
cc0680a580b5
d4b2bab4f263
1da177e4c3f4
573db6b8f93b


cc0680a580b5
1da177e4c3f4
cc0680a580b5
cca3974e4860
1da177e4c3f4
c961922b73da

9363c3825ea9
ccc4672aff18

60c3be387bb6

6a94a746fb25

1da177e4c3f4
cca3974e4860
60c3be387bb6
1da177e4c3f4
2a88d1ac8dca
1da177e4c3f4


669a5db411d8

85cd7251b911
669a5db411d8



1da177e4c3f4







669a5db411d8



85cd7251b911
669a5db411d8

6a94a746fb25






669a5db411d8
60c3be387bb6

a5bf5f5a370b



1da177e4c3f4

a5bf5f5a370b

669a5db411d8

1da177e4c3f4
2a88d1ac8dca
669a5db411d8
a5bf5f5a370b

1da177e4c3f4
a5bf5f5a370b

669a5db411d8

a5bf5f5a370b
1da177e4c3f4



ce986690d9bf


1da177e4c3f4


669a5db411d8


85cd7251b911
669a5db411d8




60c3be387bb6

1da177e4c3f4


6a94a746fb25















669a5db411d8
1da177e4c3f4
669a5db411d8
c32a8fd7cb33
1da177e4c3f4






2dcb407e6145
1da177e4c3f4
cca3974e4860
60c3be387bb6
669a5db411d8

dedf61db4f68
85cd7251b911
1da177e4c3f4
6a94a746fb25
669a5db411d8


85cd7251b911
6a94a746fb25



669a5db411d8
2dcb407e6145
85cd7251b911

669a5db411d8
85cd7251b911
669a5db411d8







85cd7251b911
669a5db411d8
85cd7251b911
669a5db411d8





85cd7251b911
669a5db411d8






1da177e4c3f4
6a94a746fb25



1da177e4c3f4
6a94a746fb25

669a5db411d8



85cd7251b911
6a94a746fb25

1da177e4c3f4
669a5db411d8












2dcb407e6145
669a5db411d8














2dcb407e6145
669a5db411d8

1da177e4c3f4

c72907245944



be77e43abb43


c72907245944






be77e43abb43
c72907245944
be77e43abb43
c72907245944

be77e43abb43
c72907245944


82ef04fb4c82

c72907245944
be77e43abb43
c72907245944



be77e43abb43

c72907245944


82ef04fb4c82

c72907245944
be77e43abb43
82ef04fb4c82
c72907245944


be77e43abb43

c72907245944


a97c40068fab





27943620cbd9







b8b275efc28e
8c3832ebeb04

1855256c497e
8c3832ebeb04
4c74d4ec3524






04d86d6fc047






d1aa690a7d1a






040dee53a724






8c3832ebeb04




b8b275efc28e
8c3832ebeb04
ffe188dd83e8






5c08ea019198






04d86d6fc047






ffe188dd83e8






04d86d6fc047






3cc0b9d3baeb






04d86d6fc047






62320e23c350






8c3832ebeb04




b8b275efc28e
8c3832ebeb04
de753e5e8678






8c3832ebeb04




b8b275efc28e
c3f93b8fc647






7d05154840db

8c3832ebeb04
7abe79c353ca



8c3832ebeb04



7abe79c353ca



1eedb4a90c95





3c387730ef26






1eedb4a90c95

8c3832ebeb04

b8b275efc28e















3a2d5b700132
b8b275efc28e

































0b62e13b5c9b

b8b275efc28e
0b62e13b5c9b
b8b275efc28e
a44fec1fce5d


b8b275efc28e









25f98131a292




1da177e4c3f4




ea6ba10bbb88
1da177e4c3f4






374b1873571b

1da177e4c3f4
7b6dbd6872ca
374b1873571b
1da177e4c3f4

7b6dbd6872ca
c47a631f8bfa
1da177e4c3f4

c47a631f8bfa
1da177e4c3f4
c47a631f8bfa
1da177e4c3f4


7b6dbd6872ca
374b1873571b
1da177e4c3f4



c621b140603d
c893a3ae4927
2e9edbf815e4
c621b140603d







c621b140603d
2e9edbf815e4
2dcb407e6145
c621b140603d

c621b140603d

44c10138fd4b
c621b140603d

44c10138fd4b
c621b140603d

31a34fe75906
a44fec1fce5d




c621b140603d
2e9edbf815e4
c621b140603d
8b09f0da0f87
ea35d29e2fa8

8b09f0da0f87
ea35d29e2fa8












8b09f0da0f87


d33f58b883a3
b4482a4b2e2f
d33f58b883a3






a44fec1fce5d
d33f58b883a3



a44fec1fce5d
d33f58b883a3


a44fec1fce5d
d33f58b883a3



669a5db411d8
d33f58b883a3
a44fec1fce5d
d33f58b883a3


a44fec1fce5d
d33f58b883a3
cca3974e4860
d33f58b883a3


a44fec1fce5d
d33f58b883a3

a44fec1fce5d
d33f58b883a3
8b09f0da0f87
d33f58b883a3

e9c1670c2a14
























a44fec1fce5d

e9c1670c2a14





be77e43abb43
c72907245944


be77e43abb43
cb6716c879ec
be77e43abb43
c72907245944



be77e43abb43
c72907245944
e9c1670c2a14



c72907245944
be77e43abb43
c72907245944


be77e43abb43
c72907245944

be77e43abb43
c72907245944

cb6716c879ec




be77e43abb43
cb6716c879ec






be77e43abb43

cb6716c879ec

a44fec1fce5d

be77e43abb43
cb6716c879ec


be77e43abb43













c72907245944

2852bcf7c12d
43a98f05d992
1855256c497e
43a98f05d992










7d05154840db

43a98f05d992
2852bcf7c12d

43a98f05d992







2852bcf7c12d
a44fec1fce5d
2852bcf7c12d

43a98f05d992


5f451fe1ab5d











65e316431153








5f451fe1ab5d













c621b140603d
1da177e4c3f4













bc5468f52b78

1da177e4c3f4
24dc5f33ea4b
d33f58b883a3
1626aeb88123
a97c40068fab
cca3974e4860
8b09f0da0f87


1da177e4c3f4
06296a1e684b
1da177e4c3f4
347979a03453

1da177e4c3f4

5f451fe1ab5d







8b09f0da0f87









2852bcf7c12d










5016d7d212db




da3ceb2288d0
5016d7d212db



8b09f0da0f87
8b09f0da0f87


1da177e4c3f4
1c5afdf7a629
8b09f0da0f87


ff0fc1467f81
8b09f0da0f87
c72907245944
8b09f0da0f87
be77e43abb43


a97c40068fab

c72907245944
1da177e4c3f4
43a98f05d992
2852bcf7c12d
43a98f05d992
1da177e4c3f4





cca3974e4860
a04ce0ffcaf5
1da177e4c3f4
c621b140603d



8b09f0da0f87



c621b140603d
517d3cc15b36
8b09f0da0f87

a97c40068fab
1da177e4c3f4

2852bcf7c12d









1da177e4c3f4



b7887196e38d

1da177e4c3f4








1da177e4c3f4






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
  














                                                                         
                                  





















                                                                         
                

                                                                    
                                                                      

                                                                 
                                                                         
                                                                        

                                                                      
                                                                        























                                                                            
                                                              







                                                                    







                         
                         
                      

                           
                      

                                  
                              




                                                                            



                                     
 
                                                                             
                                                                          
 

                                                                      
 

                                                                       


                                                      





                                                  
                                                         

                                                    
                                    


                                             

  






                                                            
                                                                          

                  

                   
                        

                                                                    
                                                                                
                      

  

                       
                              


                           

                       
                        
                            

  

                                                          
                                                  
                                                                             


                                                                           
                                                      
                                                     



                                                           

                                                                                
                                                
                                                



                                                                            


                                       
                                                    

                                                                          

                                                                


                                                                       

















                                                                       

                                                                       



                                                                       
                                                                       

                                                                       
                                                   



                                                                       

                                                                                

                                                                       
 
                        
 
                            
                                                                    
                            
                                                                    
                                                                 
                                                                    
                                     
                                                                    
                                     
                                                                    
                                        
                                                                    


                                                                     
                                                             
                                                     
                                                                    
                                                     
                                                                     
                                                        
                                                                    
                                          
                                                                    
                                          
                                                                          
                                                       
                                                                   
                                                                   
                                                                   

                                                                    
                                        
                                                                    
                                        
                                                                          
                                        
                                                                          
                                         
                                                                          
                                         
                                                                          
                                         
                                                                    
                                           
                                                                       
                                         
                                                                    


                                                                          
                                                                    

                                                                          


                                                                    

                                                                          

                                                                          

                                                                    


                                                                          
                                       
                                                                        
                                       
                                                                        



                                                                          
                                       
                                                                        

                                                                          
                                                 
                                                                        
                                                 
                                                                        



                                                                          






                                                
                                                  
                

                                                          
      

  
                                             
                                

  
                                                   
                                                        
                                                 
                                                  



                                                   
                                                   

                                                   
                                                     

  


                                                        

  



                                                        

  









                                                            

                                                         
                                                     

                                                       
                                                     

  
                                               
                    
                           












                                                  
                                               
                    
                           

                                                 
                                                 





                                                 
                                                
                    
                           

                                                                    

                                                                  


                                                 
                                                 





                                                 

                                               
                           

                                                 
                                                                          
                                       
                                                            



                                       
                                                     








                                                 

  











                                                      
                                                  










                                                 

                                                        
                                               

                                                
                                                     

                                                      
                                               

  
                                                

                                                      
                                                  

                                                                                                   


                                                 
                                                    
         
                                                  


                                                                                                   


                                                 
                                                        
         
                                                  


                                                                                    

                                                

                                                                 
         
                                                  

                                                                                  


                                                
 
                        
         
                                                                        


                                                   
                                                

          








                                                                        
                     
         
                                                  

                                             
                                            


                                                 
                     
         
                                                  

                                             
                                            


                                                 
                      
         
                                                  

                                             
                                            

                                                 
 
                     
         
                                                                    

                                             
                                            

                                                 
 
                           
         
                                                                    

                                             


                                                 
 
                        
         
                                                  

                                             


                                                 
 
                            
         
                                                  

                                             



                                                 

                         
                                                  


                                                                                                   


                                                












                                                                                      












                                                                               












                                                                   
                                                                    
                                                                   
                                                                  
                                                              
                                                                      
                                                                 
                                                                     
                                                                   
                                                                          

                                                                          
                                                                   
                                                                



                        







                                                                      
   
                                                                       







                                                                    
 
                                                     
 
                                                         
                                                              
                                                      
                
 



                                                               
                                                             
                                                    
 


                      
                                             
                                                              
                                             

                                      


   
                                                              
                          
                                                     
  


                                     
                                                                            
 
                                       
                                                         
 

                                                                        
                                                

 

                                  

                                                                          
 
                                                            
                            
                                                     
                                                            


                                       

                        
 



                                                                             







                                        



                                                  
                                                                         

                                                






                                                               
 

                                             



                                                                     

                                                             

                                               

                                                          
                                                                   
                                                          
                                                           

                                                                         
                

                                                       

                                                            
                                      



                                                 


                                                           


                                                                   


                                                                    
 




                                                                       

                                                  


   















                                                                          
                                                                         
                                                  
                                
                                                






                                                                      
                                                                                        
 
                                                            
                            

                                                                
                                    
 
                                   
                                                        


                                     
 



                                                              
                  
                                                                          

                                        
                                                                     
                                                       







                                                            
 
                                            
 





                                                              
                            






                                                                           
                 



                                                              
                

                                                           



                                                          
 

                                                        
         












                                                                         
                                                                          














                                                                         
                                                                         

                                         

 



                                                                     


                                                                    






                                    
                                                                   
 
                                       

                                                              
                                                                            


                                                 

                                                          
 
                                                                    



                                             

                                                        


                 

                                                          
 
                                                                    
 


                                             

                                                       


                 





                                                                                







                                                        
                

                                    
                                                      
                 






                                                                        






                                                                        






                                                                        






                                                                        




                                                                        
                  
                 






                                                                        






                                                                        






                                                                        






                                                                             






                                                                             






                                                                              






                                                                              






                                                                                  




                                                                              
                  
                 






                                                                              




                                                                            
                  






                                                                              

                                            
          



                                        



                                     



                                                                               





                                                                    






                                                       

                         

                 















                                                                           
                                                                     

































                                                                         

                                                                      
                   
                                               
                       


                                                                              









                                                    




                                                    




                                                  
                           






                                                                

                                                      
                         
 
                                                 

                               
 
                                               

                                    
                                                       
 
                                                       


                                      
 
                                



                  
                                                                     
                                         
  







                                                                     
                            
 
                                                                                                         

                                                                       

                                                                     
                                           

                                                                                    
                                                             

                                        
                        




                                                                               
                           
 
 
                                                          

                                                                     
                                                     












                                                                          


                                                                                
 
                       






                                                         
                                      



                                        
                                       


                              
                                       



                                                              
                                                                    
                            
                                            


                              
                                                
                                  
                                                                          


                              
                        

                        
                                                                         
 
                   

 
























                                                                            

                                                                       





                            
                                                           


                                                          
                                                       
                     
                  



                                         
                                 
 



                                
                                                       
                         


                                                                     
                         

                                                                    
                         

                                                              




                                                                    
                                                           






                                                                      

                                                                   

                                                  

                                                                                         
                                 


                 













                                                                         

 
                                                         
 
                                                      










                                                                       

                                            
          

                                                          







                                                                     
                                             
                                                                     

                                                                        


         











                                                                               








                                                                                













                                                                          
   













                                                                         

                                                                   
 
                                        
                                          
                                                                             
                                                   
                                 


                                     
 
                                                        
 

                                                              

                               







                                                                       









                                                        










                                                                     




                                                                            
                                             



                                  
                                                                            


                                                                             
 
                                                          


                                   
 
                                   
                                         
                                                                         


                                           

                                                                
         
 
                                     
                                     
 





                                                               
                                             
                                  
 



                                                                       



                                               
         
                                              

                             
                                                                         

 









                                                                     



                                 

                                                   








                           






                                                
/*
 *    ata_piix.c - Intel PATA/SATA controllers
 *
 *    Maintained by:  Jeff Garzik <jgarzik@pobox.com>
 *    		    Please ALWAYS copy linux-ide@vger.kernel.org
 *		    on emails.
 *
 *
 *	Copyright 2003-2005 Red Hat Inc
 *	Copyright 2003-2005 Jeff Garzik
 *
 *
 *	Copyright header from piix.c:
 *
 *  Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
 *  Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
 *  Copyright (C) 2003 Red Hat Inc
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *
 *  libata documentation is available via 'make {ps|pdf}docs',
 *  as Documentation/DocBook/libata.*
 *
 *  Hardware documentation available at http://developer.intel.com/
 *
 * Documentation
 *	Publicly available from Intel web site. Errata documentation
 * is also publicly available. As an aide to anyone hacking on this
 * driver the list of errata that are relevant is below, going back to
 * PIIX4. Older device documentation is now a bit tricky to find.
 *
 * The chipsets all follow very much the same design. The original Triton
 * series chipsets do _not_ support independent device timings, but this
 * is fixed in Triton II. With the odd mobile exception the chips then
 * change little except in gaining more modes until SATA arrives. This
 * driver supports only the chips with independent timing (that is those
 * with SITRE and the 0x44 timing register). See pata_oldpiix and pata_mpiix
 * for the early chip drivers.
 *
 * Errata of note:
 *
 * Unfixable
 *	PIIX4    errata #9	- Only on ultra obscure hw
 *	ICH3	 errata #13     - Not observed to affect real hw
 *				  by Intel
 *
 * Things we must deal with
 *	PIIX4	errata #10	- BM IDE hang with non UDMA
 *				  (must stop/start dma to recover)
 *	440MX   errata #15	- As PIIX4 errata #10
 *	PIIX4	errata #15	- Must not read control registers
 * 				  during a PIO transfer
 *	440MX   errata #13	- As PIIX4 errata #15
 *	ICH2	errata #21	- DMA mode 0 doesn't work right
 *	ICH0/1  errata #55	- As ICH2 errata #21
 *	ICH2	spec c #9	- Extra operations needed to handle
 *				  drive hotswap [NOT YET SUPPORTED]
 *	ICH2    spec c #20	- IDE PRD must not cross a 64K boundary
 *				  and must be dword aligned
 *	ICH2    spec c #24	- UDMA mode 4,5 t85/86 should be 6ns not 3.3
 *	ICH7	errata #16	- MWDMA1 timings are incorrect
 *
 * Should have been BIOS fixed:
 *	450NX:	errata #19	- DMA hangs on old 450NX
 *	450NX:  errata #20	- DMA hangs on old 450NX
 *	450NX:  errata #25	- Corruption with DMA on old 450NX
 *	ICH3    errata #15      - IDE deadlock under high load
 *				  (BIOS must set dev 31 fn 0 bit 23)
 *	ICH3	errata #18	- Don't use native mode
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/gfp.h>
#include <scsi/scsi_host.h>
#include <linux/libata.h>
#include <linux/dmi.h>

#define DRV_NAME	"ata_piix"
#define DRV_VERSION	"2.13"

enum {
	PIIX_IOCFG		= 0x54, /* IDE I/O configuration register */
	ICH5_PMR		= 0x90, /* port mapping register */
	ICH5_PCS		= 0x92,	/* port control and status */
	PIIX_SIDPR_BAR		= 5,
	PIIX_SIDPR_LEN		= 16,
	PIIX_SIDPR_IDX		= 0,
	PIIX_SIDPR_DATA		= 4,

	PIIX_FLAG_CHECKINTR	= (1 << 28), /* make sure PCI INTx enabled */
	PIIX_FLAG_SIDPR		= (1 << 29), /* SATA idx/data pair regs */

	PIIX_PATA_FLAGS		= ATA_FLAG_SLAVE_POSS,
	PIIX_SATA_FLAGS		= ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR,

	PIIX_FLAG_PIO16		= (1 << 30), /*support 16bit PIO only*/

	PIIX_80C_PRI		= (1 << 5) | (1 << 4),
	PIIX_80C_SEC		= (1 << 7) | (1 << 6),

	/* constants for mapping table */
	P0			= 0,  /* port 0 */
	P1			= 1,  /* port 1 */
	P2			= 2,  /* port 2 */
	P3			= 3,  /* port 3 */
	IDE			= -1, /* IDE */
	NA			= -2, /* not available */
	RV			= -3, /* reserved */

	PIIX_AHCI_DEVICE	= 6,

	/* host->flags bits */
	PIIX_HOST_BROKEN_SUSPEND = (1 << 24),
};

enum piix_controller_ids {
	/* controller IDs */
	piix_pata_mwdma,	/* PIIX3 MWDMA only */
	piix_pata_33,		/* PIIX4 at 33Mhz */
	ich_pata_33,		/* ICH up to UDMA 33 only */
	ich_pata_66,		/* ICH up to 66 Mhz */
	ich_pata_100,		/* ICH up to UDMA 100 */
	ich_pata_100_nomwdma1,	/* ICH up to UDMA 100 but with no MWDMA1*/
	ich5_sata,
	ich6_sata,
	ich6m_sata,
	ich8_sata,
	ich8_2port_sata,
	ich8m_apple_sata,	/* locks up on second port enable */
	tolapai_sata,
	piix_pata_vmw,			/* PIIX4 for VMware, spurious DMA_ERR */
	ich8_sata_snb,
};

struct piix_map_db {
	const u32 mask;
	const u16 port_enable;
	const int map[][4];
};

struct piix_host_priv {
	const int *map;
	u32 saved_iocfg;
	void __iomem *sidpr;
};

static int piix_init_one(struct pci_dev *pdev,
			 const struct pci_device_id *ent);
static void piix_remove_one(struct pci_dev *pdev);
static int piix_pata_prereset(struct ata_link *link, unsigned long deadline);
static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev);
static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev);
static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev);
static int ich_pata_cable_detect(struct ata_port *ap);
static u8 piix_vmw_bmdma_status(struct ata_port *ap);
static int piix_sidpr_scr_read(struct ata_link *link,
			       unsigned int reg, u32 *val);
static int piix_sidpr_scr_write(struct ata_link *link,
				unsigned int reg, u32 val);
static int piix_sidpr_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
			      unsigned hints);
static bool piix_irq_check(struct ata_port *ap);
static int piix_port_start(struct ata_port *ap);
#ifdef CONFIG_PM
static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
static int piix_pci_device_resume(struct pci_dev *pdev);
#endif

static unsigned int in_module_init = 1;

static const struct pci_device_id piix_pci_tbl[] = {
	/* Intel PIIX3 for the 430HX etc */
	{ 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
	/* VMware ICH4 */
	{ 0x8086, 0x7111, 0x15ad, 0x1976, 0, 0, piix_pata_vmw },
	/* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
	/* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
	{ 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
	/* Intel PIIX4 */
	{ 0x8086, 0x7199, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
	/* Intel PIIX4 */
	{ 0x8086, 0x7601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
	/* Intel PIIX */
	{ 0x8086, 0x84CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
	/* Intel ICH (i810, i815, i840) UDMA 66*/
	{ 0x8086, 0x2411, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_66 },
	/* Intel ICH0 : UDMA 33*/
	{ 0x8086, 0x2421, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_33 },
	/* Intel ICH2M */
	{ 0x8086, 0x244A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* Intel ICH2 (i810E2, i845, 850, 860) UDMA 100 */
	{ 0x8086, 0x244B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/*  Intel ICH3M */
	{ 0x8086, 0x248A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* Intel ICH3 (E7500/1) UDMA 100 */
	{ 0x8086, 0x248B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* Intel ICH4-L */
	{ 0x8086, 0x24C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* Intel ICH4 (i845GV, i845E, i852, i855) UDMA 100 */
	{ 0x8086, 0x24CA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	{ 0x8086, 0x24CB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* Intel ICH5 */
	{ 0x8086, 0x24DB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* C-ICH (i810E2) */
	{ 0x8086, 0x245B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* ESB (855GME/875P + 6300ESB) UDMA 100  */
	{ 0x8086, 0x25A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* ICH6 (and 6) (i915) UDMA 100 */
	{ 0x8086, 0x266F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
	/* ICH7/7-R (i945, i975) UDMA 100*/
	{ 0x8086, 0x27DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100_nomwdma1 },
	{ 0x8086, 0x269E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100_nomwdma1 },
	/* ICH8 Mobile PATA Controller */
	{ 0x8086, 0x2850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },

	/* SATA ports */

	/* 82801EB (ICH5) */
	{ 0x8086, 0x24d1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
	/* 82801EB (ICH5) */
	{ 0x8086, 0x24df, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
	/* 6300ESB (ICH5 variant with broken PCS present bits) */
	{ 0x8086, 0x25a3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
	/* 6300ESB pretending RAID */
	{ 0x8086, 0x25b0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich5_sata },
	/* 82801FB/FW (ICH6/ICH6W) */
	{ 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
	/* 82801FR/FRW (ICH6R/ICH6RW) */
	{ 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
	/* 82801FBM ICH6M (ICH6R with only port 0 and 2 implemented).
	 * Attach iff the controller is in IDE mode. */
	{ 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID,
	  PCI_CLASS_STORAGE_IDE << 8, 0xffff00, ich6m_sata },
	/* 82801GB/GR/GH (ICH7, identical to ICH6) */
	{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
	/* 2801GBM/GHM (ICH7M, identical to ICH6M) */
	{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata },
	/* Enterprise Southbridge 2 (631xESB/632xESB) */
	{ 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
	/* SATA Controller 1 IDE (ICH8) */
	{ 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller 2 IDE (ICH8) */
	{ 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* Mobile SATA Controller IDE (ICH8M), Apple */
	{ 0x8086, 0x2828, 0x106b, 0x00a0, 0, 0, ich8m_apple_sata },
	{ 0x8086, 0x2828, 0x106b, 0x00a1, 0, 0, ich8m_apple_sata },
	{ 0x8086, 0x2828, 0x106b, 0x00a3, 0, 0, ich8m_apple_sata },
	/* Mobile SATA Controller IDE (ICH8M) */
	{ 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (ICH9) */
	{ 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (ICH9) */
	{ 0x8086, 0x2921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (ICH9) */
	{ 0x8086, 0x2926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (ICH9M) */
	{ 0x8086, 0x2928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (ICH9M) */
	{ 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (ICH9M) */
	{ 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (Tolapai) */
	{ 0x8086, 0x5028, PCI_ANY_ID, PCI_ANY_ID, 0, 0, tolapai_sata },
	/* SATA Controller IDE (ICH10) */
	{ 0x8086, 0x3a00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (ICH10) */
	{ 0x8086, 0x3a06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (ICH10) */
	{ 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (ICH10) */
	{ 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (PCH) */
	{ 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (PCH) */
	{ 0x8086, 0x3b21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (PCH) */
	{ 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (PCH) */
	{ 0x8086, 0x3b28, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (PCH) */
	{ 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (PCH) */
	{ 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
	/* SATA Controller IDE (CPT) */
	{ 0x8086, 0x1c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
	/* SATA Controller IDE (CPT) */
	{ 0x8086, 0x1c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
	/* SATA Controller IDE (CPT) */
	{ 0x8086, 0x1c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (CPT) */
	{ 0x8086, 0x1c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (PBG) */
	{ 0x8086, 0x1d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
	/* SATA Controller IDE (PBG) */
	{ 0x8086, 0x1d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (Panther Point) */
	{ 0x8086, 0x1e00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
	/* SATA Controller IDE (Panther Point) */
	{ 0x8086, 0x1e01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
	/* SATA Controller IDE (Panther Point) */
	{ 0x8086, 0x1e08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	/* SATA Controller IDE (Panther Point) */
	{ 0x8086, 0x1e09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
	{ }	/* terminate list */
};

static struct pci_driver piix_pci_driver = {
	.name			= DRV_NAME,
	.id_table		= piix_pci_tbl,
	.probe			= piix_init_one,
	.remove			= piix_remove_one,
#ifdef CONFIG_PM
	.suspend		= piix_pci_device_suspend,
	.resume			= piix_pci_device_resume,
#endif
};

static struct scsi_host_template piix_sht = {
	ATA_BMDMA_SHT(DRV_NAME),
};

static struct ata_port_operations piix_sata_ops = {
	.inherits		= &ata_bmdma32_port_ops,
	.sff_irq_check		= piix_irq_check,
	.port_start		= piix_port_start,
};

static struct ata_port_operations piix_pata_ops = {
	.inherits		= &piix_sata_ops,
	.cable_detect		= ata_cable_40wire,
	.set_piomode		= piix_set_piomode,
	.set_dmamode		= piix_set_dmamode,
	.prereset		= piix_pata_prereset,
};

static struct ata_port_operations piix_vmw_ops = {
	.inherits		= &piix_pata_ops,
	.bmdma_status		= piix_vmw_bmdma_status,
};

static struct ata_port_operations ich_pata_ops = {
	.inherits		= &piix_pata_ops,
	.cable_detect		= ich_pata_cable_detect,
	.set_dmamode		= ich_set_dmamode,
};

static struct device_attribute *piix_sidpr_shost_attrs[] = {
	&dev_attr_link_power_management_policy,
	NULL
};

static struct scsi_host_template piix_sidpr_sht = {
	ATA_BMDMA_SHT(DRV_NAME),
	.shost_attrs		= piix_sidpr_shost_attrs,
};

static struct ata_port_operations piix_sidpr_sata_ops = {
	.inherits		= &piix_sata_ops,
	.hardreset		= sata_std_hardreset,
	.scr_read		= piix_sidpr_scr_read,
	.scr_write		= piix_sidpr_scr_write,
	.set_lpm		= piix_sidpr_set_lpm,
};

static const struct piix_map_db ich5_map_db = {
	.mask = 0x7,
	.port_enable = 0x3,
	.map = {
		/* PM   PS   SM   SS       MAP  */
		{  P0,  NA,  P1,  NA }, /* 000b */
		{  P1,  NA,  P0,  NA }, /* 001b */
		{  RV,  RV,  RV,  RV },
		{  RV,  RV,  RV,  RV },
		{  P0,  P1, IDE, IDE }, /* 100b */
		{  P1,  P0, IDE, IDE }, /* 101b */
		{ IDE, IDE,  P0,  P1 }, /* 110b */
		{ IDE, IDE,  P1,  P0 }, /* 111b */
	},
};

static const struct piix_map_db ich6_map_db = {
	.mask = 0x3,
	.port_enable = 0xf,
	.map = {
		/* PM   PS   SM   SS       MAP */
		{  P0,  P2,  P1,  P3 }, /* 00b */
		{ IDE, IDE,  P1,  P3 }, /* 01b */
		{  P0,  P2, IDE, IDE }, /* 10b */
		{  RV,  RV,  RV,  RV },
	},
};

static const struct piix_map_db ich6m_map_db = {
	.mask = 0x3,
	.port_enable = 0x5,

	/* Map 01b isn't specified in the doc but some notebooks use
	 * it anyway.  MAP 01b have been spotted on both ICH6M and
	 * ICH7M.
	 */
	.map = {
		/* PM   PS   SM   SS       MAP */
		{  P0,  P2,  NA,  NA }, /* 00b */
		{ IDE, IDE,  P1,  P3 }, /* 01b */
		{  P0,  P2, IDE, IDE }, /* 10b */
		{  RV,  RV,  RV,  RV },
	},
};

static const struct piix_map_db ich8_map_db = {
	.mask = 0x3,
	.port_enable = 0xf,
	.map = {
		/* PM   PS   SM   SS       MAP */
		{  P0,  P2,  P1,  P3 }, /* 00b (hardwired when in AHCI) */
		{  RV,  RV,  RV,  RV },
		{  P0,  P2, IDE, IDE }, /* 10b (IDE mode) */
		{  RV,  RV,  RV,  RV },
	},
};

static const struct piix_map_db ich8_2port_map_db = {
	.mask = 0x3,
	.port_enable = 0x3,
	.map = {
		/* PM   PS   SM   SS       MAP */
		{  P0,  NA,  P1,  NA }, /* 00b */
		{  RV,  RV,  RV,  RV }, /* 01b */
		{  RV,  RV,  RV,  RV }, /* 10b */
		{  RV,  RV,  RV,  RV },
	},
};

static const struct piix_map_db ich8m_apple_map_db = {
	.mask = 0x3,
	.port_enable = 0x1,
	.map = {
		/* PM   PS   SM   SS       MAP */
		{  P0,  NA,  NA,  NA }, /* 00b */
		{  RV,  RV,  RV,  RV },
		{  P0,  P2, IDE, IDE }, /* 10b */
		{  RV,  RV,  RV,  RV },
	},
};

static const struct piix_map_db tolapai_map_db = {
	.mask = 0x3,
	.port_enable = 0x3,
	.map = {
		/* PM   PS   SM   SS       MAP */
		{  P0,  NA,  P1,  NA }, /* 00b */
		{  RV,  RV,  RV,  RV }, /* 01b */
		{  RV,  RV,  RV,  RV }, /* 10b */
		{  RV,  RV,  RV,  RV },
	},
};

static const struct piix_map_db *piix_map_db_table[] = {
	[ich5_sata]		= &ich5_map_db,
	[ich6_sata]		= &ich6_map_db,
	[ich6m_sata]		= &ich6m_map_db,
	[ich8_sata]		= &ich8_map_db,
	[ich8_2port_sata]	= &ich8_2port_map_db,
	[ich8m_apple_sata]	= &ich8m_apple_map_db,
	[tolapai_sata]		= &tolapai_map_db,
	[ich8_sata_snb]		= &ich8_map_db,
};

static struct ata_port_info piix_port_info[] = {
	[piix_pata_mwdma] = 	/* PIIX3 MWDMA only */
	{
		.flags		= PIIX_PATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
		.port_ops	= &piix_pata_ops,
	},

	[piix_pata_33] =	/* PIIX4 at 33MHz */
	{
		.flags		= PIIX_PATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
		.udma_mask	= ATA_UDMA2,
		.port_ops	= &piix_pata_ops,
	},

	[ich_pata_33] = 	/* ICH0 - ICH at 33Mhz*/
	{
		.flags		= PIIX_PATA_FLAGS,
		.pio_mask 	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA12_ONLY, /* Check: maybe MWDMA0 is ok  */
		.udma_mask	= ATA_UDMA2,
		.port_ops	= &ich_pata_ops,
	},

	[ich_pata_66] = 	/* ICH controllers up to 66MHz */
	{
		.flags		= PIIX_PATA_FLAGS,
		.pio_mask 	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA12_ONLY, /* MWDMA0 is broken on chip */
		.udma_mask	= ATA_UDMA4,
		.port_ops	= &ich_pata_ops,
	},

	[ich_pata_100] =
	{
		.flags		= PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA12_ONLY,
		.udma_mask	= ATA_UDMA5,
		.port_ops	= &ich_pata_ops,
	},

	[ich_pata_100_nomwdma1] =
	{
		.flags		= PIIX_PATA_FLAGS | PIIX_FLAG_CHECKINTR,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2_ONLY,
		.udma_mask	= ATA_UDMA5,
		.port_ops	= &ich_pata_ops,
	},

	[ich5_sata] =
	{
		.flags		= PIIX_SATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[ich6_sata] =
	{
		.flags		= PIIX_SATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[ich6m_sata] =
	{
		.flags		= PIIX_SATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[ich8_sata] =
	{
		.flags		= PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[ich8_2port_sata] =
	{
		.flags		= PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[tolapai_sata] =
	{
		.flags		= PIIX_SATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[ich8m_apple_sata] =
	{
		.flags		= PIIX_SATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

	[piix_pata_vmw] =
	{
		.flags		= PIIX_PATA_FLAGS,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA12_ONLY, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
		.udma_mask	= ATA_UDMA2,
		.port_ops	= &piix_vmw_ops,
	},

	/*
	 * some Sandybridge chipsets have broken 32 mode up to now,
	 * see https://bugzilla.kernel.org/show_bug.cgi?id=40592
	 */
	[ich8_sata_snb] =
	{
		.flags		= PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16,
		.pio_mask	= ATA_PIO4,
		.mwdma_mask	= ATA_MWDMA2,
		.udma_mask	= ATA_UDMA6,
		.port_ops	= &piix_sata_ops,
	},

};

static struct pci_bits piix_enable_bits[] = {
	{ 0x41U, 1U, 0x80UL, 0x80UL },	/* port 0 */
	{ 0x43U, 1U, 0x80UL, 0x80UL },	/* port 1 */
};

MODULE_AUTHOR("Andre Hedrick, Alan Cox, Andrzej Krzysztofowicz, Jeff Garzik");
MODULE_DESCRIPTION("SCSI low-level driver for Intel PIIX/ICH ATA controllers");
MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(pci, piix_pci_tbl);
MODULE_VERSION(DRV_VERSION);

struct ich_laptop {
	u16 device;
	u16 subvendor;
	u16 subdevice;
};

/*
 *	List of laptops that use short cables rather than 80 wire
 */

static const struct ich_laptop ich_laptop[] = {
	/* devid, subvendor, subdev */
	{ 0x27DF, 0x0005, 0x0280 },	/* ICH7 on Acer 5602WLMi */
	{ 0x27DF, 0x1025, 0x0102 },	/* ICH7 on Acer 5602aWLMi */
	{ 0x27DF, 0x1025, 0x0110 },	/* ICH7 on Acer 3682WLMi */
	{ 0x27DF, 0x1028, 0x02b0 },	/* ICH7 on unknown Dell */
	{ 0x27DF, 0x1043, 0x1267 },	/* ICH7 on Asus W5F */
	{ 0x27DF, 0x103C, 0x30A1 },	/* ICH7 on HP Compaq nc2400 */
	{ 0x27DF, 0x103C, 0x361a },	/* ICH7 on unknown HP  */
	{ 0x27DF, 0x1071, 0xD221 },	/* ICH7 on Hercules EC-900 */
	{ 0x27DF, 0x152D, 0x0778 },	/* ICH7 on unknown Intel */
	{ 0x24CA, 0x1025, 0x0061 },	/* ICH4 on ACER Aspire 2023WLMi */
	{ 0x24CA, 0x1025, 0x003d },	/* ICH4 on ACER TM290 */
	{ 0x266F, 0x1025, 0x0066 },	/* ICH6 on ACER Aspire 1694WLMi */
	{ 0x2653, 0x1043, 0x82D8 },	/* ICH6M on Asus Eee 701 */
	{ 0x27df, 0x104d, 0x900e },	/* ICH7 on Sony TZ-90 */
	/* end marker */
	{ 0, }
};

static int piix_port_start(struct ata_port *ap)
{
	if (!(ap->flags & PIIX_FLAG_PIO16))
		ap->pflags |= ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE;

	return ata_bmdma_port_start(ap);
}

/**
 *	ich_pata_cable_detect - Probe host controller cable detect info
 *	@ap: Port for which cable detect info is desired
 *
 *	Read 80c cable indicator from ATA PCI device's PCI config
 *	register.  This register is normally set by firmware (BIOS).
 *
 *	LOCKING:
 *	None (inherited from caller).
 */

static int ich_pata_cable_detect(struct ata_port *ap)
{
	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
	struct piix_host_priv *hpriv = ap->host->private_data;
	const struct ich_laptop *lap = &ich_laptop[0];
	u8 mask;

	/* Check for specials - Acer Aspire 5602WLMi */
	while (lap->device) {
		if (lap->device == pdev->device &&
		    lap->subvendor == pdev->subsystem_vendor &&
		    lap->subdevice == pdev->subsystem_device)
			return ATA_CBL_PATA40_SHORT;

		lap++;
	}

	/* check BIOS cable detect results */
	mask = ap->port_no == 0 ? PIIX_80C_PRI : PIIX_80C_SEC;
	if ((hpriv->saved_iocfg & mask) == 0)
		return ATA_CBL_PATA40;
	return ATA_CBL_PATA80;
}

/**
 *	piix_pata_prereset - prereset for PATA host controller
 *	@link: Target link
 *	@deadline: deadline jiffies for the operation
 *
 *	LOCKING:
 *	None (inherited from caller).
 */
static int piix_pata_prereset(struct ata_link *link, unsigned long deadline)
{
	struct ata_port *ap = link->ap;
	struct pci_dev *pdev = to_pci_dev(ap->host->dev);

	if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no]))
		return -ENOENT;
	return ata_sff_prereset(link, deadline);
}

static DEFINE_SPINLOCK(piix_lock);

static void piix_set_timings(struct ata_port *ap, struct ata_device *adev,
			     u8 pio)
{
	struct pci_dev *dev	= to_pci_dev(ap->host->dev);
	unsigned long flags;
	unsigned int is_slave	= (adev->devno != 0);
	unsigned int master_port= ap->port_no ? 0x42 : 0x40;
	unsigned int slave_port	= 0x44;
	u16 master_data;
	u8 slave_data;
	u8 udma_enable;
	int control = 0;

	/*
	 *	See Intel Document 298600-004 for the timing programing rules
	 *	for ICH controllers.
	 */

	static const	 /* ISP  RTC */
	u8 timings[][2]	= { { 0, 0 },
			    { 0, 0 },
			    { 1, 0 },
			    { 2, 1 },
			    { 2, 3 }, };

	if (pio >= 2)
		control |= 1;	/* TIME1 enable */
	if (ata_pio_need_iordy(adev))
		control |= 2;	/* IE enable */
	/* Intel specifies that the PPE functionality is for disk only */
	if (adev->class == ATA_DEV_ATA)
		control |= 4;	/* PPE enable */
	/*
	 * If the drive MWDMA is faster than it can do PIO then
	 * we must force PIO into PIO0
	 */
	if (adev->pio_mode < XFER_PIO_0 + pio)
		/* Enable DMA timing only */
		control |= 8;	/* PIO cycles in PIO0 */

	spin_lock_irqsave(&piix_lock, flags);

	/* PIO configuration clears DTE unconditionally.  It will be
	 * programmed in set_dmamode which is guaranteed to be called
	 * after set_piomode if any DMA mode is available.
	 */
	pci_read_config_word(dev, master_port, &master_data);
	if (is_slave) {
		/* clear TIME1|IE1|PPE1|DTE1 */
		master_data &= 0xff0f;
		/* enable PPE1, IE1 and TIME1 as needed */
		master_data |= (control << 4);
		pci_read_config_byte(dev, slave_port, &slave_data);
		slave_data &= (ap->port_no ? 0x0f : 0xf0);
		/* Load the timing nibble for this slave */
		slave_data |= ((timings[pio][0] << 2) | timings[pio][1])
						<< (ap->port_no ? 4 : 0);
	} else {
		/* clear ISP|RCT|TIME0|IE0|PPE0|DTE0 */
		master_data &= 0xccf0;
		/* Enable PPE, IE and TIME as appropriate */
		master_data |= control;
		/* load ISP and RCT */
		master_data |=
			(timings[pio][0] << 12) |
			(timings[pio][1] << 8);
	}

	/* Enable SITRE (separate slave timing register) */
	master_data |= 0x4000;
	pci_write_config_word(dev, master_port, master_data);
	if (is_slave)
		pci_write_config_byte(dev, slave_port, slave_data);

	/* Ensure the UDMA bit is off - it will be turned back on if
	   UDMA is selected */

	if (ap->udma_mask) {
		pci_read_config_byte(dev, 0x48, &udma_enable);
		udma_enable &= ~(1 << (2 * ap->port_no + adev->devno));
		pci_write_config_byte(dev, 0x48, udma_enable);
	}

	spin_unlock_irqrestore(&piix_lock, flags);
}

/**
 *	piix_set_piomode - Initialize host controller PATA PIO timings
 *	@ap: Port whose timings we are configuring
 *	@adev: Drive in question
 *
 *	Set PIO mode for device, in host controller PCI config space.
 *
 *	LOCKING:
 *	None (inherited from caller).
 */

static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev)
{
	piix_set_timings(ap, adev, adev->pio_mode - XFER_PIO_0);
}

/**
 *	do_pata_set_dmamode - Initialize host controller PATA PIO timings
 *	@ap: Port whose timings we are configuring
 *	@adev: Drive in question
 *	@isich: set if the chip is an ICH device
 *
 *	Set UDMA mode for device, in host controller PCI config space.
 *
 *	LOCKING:
 *	None (inherited from caller).
 */

static void do_pata_set_dmamode(struct ata_port *ap, struct ata_device *adev, int isich)
{
	struct pci_dev *dev	= to_pci_dev(ap->host->dev);
	unsigned long flags;
	u8 speed		= adev->dma_mode;
	int devid		= adev->devno + 2 * ap->port_no;
	u8 udma_enable		= 0;

	if (speed >= XFER_UDMA_0) {
		unsigned int udma = speed - XFER_UDMA_0;
		u16 udma_timing;
		u16 ideconf;