@@ -66,7 +66,6 @@ static u32 find_freq_from_fid(u32 fid)
66
66
return 800 + (fid * 100 );
67
67
}
68
68
69
-
70
69
/* Return a frequency in KHz, given an input fid */
71
70
static u32 find_khz_freq_from_fid (u32 fid )
72
71
{
@@ -78,7 +77,6 @@ static u32 find_khz_freq_from_pstate(struct cpufreq_frequency_table *data, u32 p
78
77
return data [pstate ].frequency ;
79
78
}
80
79
81
-
82
80
/* Return the vco fid for an input fid
83
81
*
84
82
* Each "low" fid has corresponding "high" fid, and you can get to "low" fids
@@ -166,7 +164,6 @@ static void fidvid_msr_init(void)
166
164
wrmsr (MSR_FIDVID_CTL , lo , hi );
167
165
}
168
166
169
-
170
167
/* write the new fid value along with the other control fields to the msr */
171
168
static int write_new_fid (struct powernow_k8_data * data , u32 fid )
172
169
{
@@ -740,44 +737,63 @@ static int find_psb_table(struct powernow_k8_data *data)
740
737
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
741
738
static void powernow_k8_acpi_pst_values (struct powernow_k8_data * data , unsigned int index )
742
739
{
743
- if (!data -> acpi_data . state_count || (cpu_family == CPU_HW_PSTATE ))
740
+ if (!data -> acpi_data -> state_count || (cpu_family == CPU_HW_PSTATE ))
744
741
return ;
745
742
746
- data -> irt = (data -> acpi_data .states [index ].control >> IRT_SHIFT ) & IRT_MASK ;
747
- data -> rvo = (data -> acpi_data .states [index ].control >> RVO_SHIFT ) & RVO_MASK ;
748
- data -> exttype = (data -> acpi_data .states [index ].control >> EXT_TYPE_SHIFT ) & EXT_TYPE_MASK ;
749
- data -> plllock = (data -> acpi_data .states [index ].control >> PLL_L_SHIFT ) & PLL_L_MASK ;
750
- data -> vidmvs = 1 << ((data -> acpi_data .states [index ].control >> MVS_SHIFT ) & MVS_MASK );
751
- data -> vstable = (data -> acpi_data .states [index ].control >> VST_SHIFT ) & VST_MASK ;
743
+ data -> irt = (data -> acpi_data -> states [index ].control >> IRT_SHIFT ) & IRT_MASK ;
744
+ data -> rvo = (data -> acpi_data -> states [index ].control >> RVO_SHIFT ) & RVO_MASK ;
745
+ data -> exttype = (data -> acpi_data -> states [index ].control >> EXT_TYPE_SHIFT ) & EXT_TYPE_MASK ;
746
+ data -> plllock = (data -> acpi_data -> states [index ].control >> PLL_L_SHIFT ) & PLL_L_MASK ;
747
+ data -> vidmvs = 1 << ((data -> acpi_data -> states [index ].control >> MVS_SHIFT ) & MVS_MASK );
748
+ data -> vstable = (data -> acpi_data -> states [index ].control >> VST_SHIFT ) & VST_MASK ;
749
+ }
750
+
751
+
752
+ static struct acpi_processor_performance * acpi_perf_data ;
753
+ static int preregister_valid ;
754
+
755
+ static int powernow_k8_cpu_preinit_acpi (void )
756
+ {
757
+ acpi_perf_data = alloc_percpu (struct acpi_processor_performance );
758
+ if (!acpi_perf_data )
759
+ return - ENODEV ;
760
+
761
+ if (acpi_processor_preregister_performance (acpi_perf_data ))
762
+ return - ENODEV ;
763
+ else
764
+ preregister_valid = 1 ;
765
+ return 0 ;
752
766
}
753
767
754
768
static int powernow_k8_cpu_init_acpi (struct powernow_k8_data * data )
755
769
{
756
770
struct cpufreq_frequency_table * powernow_table ;
757
771
int ret_val ;
772
+ int cpu = 0 ;
758
773
759
- if (acpi_processor_register_performance (& data -> acpi_data , data -> cpu )) {
774
+ data -> acpi_data = percpu_ptr (acpi_perf_data , cpu );
775
+ if (acpi_processor_register_performance (data -> acpi_data , data -> cpu )) {
760
776
dprintk ("register performance failed: bad ACPI data\n" );
761
777
return - EIO ;
762
778
}
763
779
764
780
/* verify the data contained in the ACPI structures */
765
- if (data -> acpi_data . state_count <= 1 ) {
781
+ if (data -> acpi_data -> state_count <= 1 ) {
766
782
dprintk ("No ACPI P-States\n" );
767
783
goto err_out ;
768
784
}
769
785
770
- if ((data -> acpi_data . control_register .space_id != ACPI_ADR_SPACE_FIXED_HARDWARE ) ||
771
- (data -> acpi_data . status_register .space_id != ACPI_ADR_SPACE_FIXED_HARDWARE )) {
786
+ if ((data -> acpi_data -> control_register .space_id != ACPI_ADR_SPACE_FIXED_HARDWARE ) ||
787
+ (data -> acpi_data -> status_register .space_id != ACPI_ADR_SPACE_FIXED_HARDWARE )) {
772
788
dprintk ("Invalid control/status registers (%x - %x)\n" ,
773
- data -> acpi_data . control_register .space_id ,
774
- data -> acpi_data . status_register .space_id );
789
+ data -> acpi_data -> control_register .space_id ,
790
+ data -> acpi_data -> status_register .space_id );
775
791
goto err_out ;
776
792
}
777
793
778
794
/* fill in data->powernow_table */
779
795
powernow_table = kmalloc ((sizeof (struct cpufreq_frequency_table )
780
- * (data -> acpi_data . state_count + 1 )), GFP_KERNEL );
796
+ * (data -> acpi_data -> state_count + 1 )), GFP_KERNEL );
781
797
if (!powernow_table ) {
782
798
dprintk ("powernow_table memory alloc failure\n" );
783
799
goto err_out ;
@@ -790,29 +806,44 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
790
806
if (ret_val )
791
807
goto err_out_mem ;
792
808
793
- powernow_table [data -> acpi_data . state_count ].frequency = CPUFREQ_TABLE_END ;
794
- powernow_table [data -> acpi_data . state_count ].index = 0 ;
809
+ powernow_table [data -> acpi_data -> state_count ].frequency = CPUFREQ_TABLE_END ;
810
+ powernow_table [data -> acpi_data -> state_count ].index = 0 ;
795
811
data -> powernow_table = powernow_table ;
796
812
797
813
/* fill in data */
798
- data -> numps = data -> acpi_data . state_count ;
814
+ data -> numps = data -> acpi_data -> state_count ;
799
815
if (first_cpu (per_cpu (cpu_core_map , data -> cpu )) == data -> cpu )
800
816
print_basics (data );
801
817
powernow_k8_acpi_pst_values (data , 0 );
802
818
803
819
/* notify BIOS that we exist */
804
820
acpi_processor_notify_smm (THIS_MODULE );
805
821
822
+ /* determine affinity, from ACPI if available */
823
+ if (preregister_valid ) {
824
+ if ((data -> acpi_data -> shared_type == CPUFREQ_SHARED_TYPE_ALL ) ||
825
+ (data -> acpi_data -> shared_type == CPUFREQ_SHARED_TYPE_ANY ))
826
+ data -> starting_core_affinity = data -> acpi_data -> shared_cpu_map ;
827
+ else
828
+ data -> starting_core_affinity = cpumask_of_cpu (data -> cpu );
829
+ } else {
830
+ /* best guess from family if not */
831
+ if (cpu_family == CPU_HW_PSTATE )
832
+ data -> starting_core_affinity = cpumask_of_cpu (data -> cpu );
833
+ else
834
+ data -> starting_core_affinity = per_cpu (cpu_core_map , data -> cpu );
835
+ }
836
+
806
837
return 0 ;
807
838
808
839
err_out_mem :
809
840
kfree (powernow_table );
810
841
811
842
err_out :
812
- acpi_processor_unregister_performance (& data -> acpi_data , data -> cpu );
843
+ acpi_processor_unregister_performance (data -> acpi_data , data -> cpu );
813
844
814
845
/* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */
815
- data -> acpi_data . state_count = 0 ;
846
+ data -> acpi_data -> state_count = 0 ;
816
847
817
848
return - ENODEV ;
818
849
}
@@ -824,10 +855,10 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
824
855
rdmsr (MSR_PSTATE_CUR_LIMIT , hi , lo );
825
856
data -> max_hw_pstate = (hi & HW_PSTATE_MAX_MASK ) >> HW_PSTATE_MAX_SHIFT ;
826
857
827
- for (i = 0 ; i < data -> acpi_data . state_count ; i ++ ) {
858
+ for (i = 0 ; i < data -> acpi_data -> state_count ; i ++ ) {
828
859
u32 index ;
829
860
830
- index = data -> acpi_data . states [i ].control & HW_PSTATE_MASK ;
861
+ index = data -> acpi_data -> states [i ].control & HW_PSTATE_MASK ;
831
862
if (index > data -> max_hw_pstate ) {
832
863
printk (KERN_ERR PFX "invalid pstate %d - bad value %d.\n" , i , index );
833
864
printk (KERN_ERR PFX "Please report to BIOS manufacturer\n" );
@@ -843,7 +874,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
843
874
844
875
powernow_table [i ].index = index ;
845
876
846
- powernow_table [i ].frequency = data -> acpi_data . states [i ].core_frequency * 1000 ;
877
+ powernow_table [i ].frequency = data -> acpi_data -> states [i ].core_frequency * 1000 ;
847
878
}
848
879
return 0 ;
849
880
}
@@ -852,16 +883,16 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
852
883
{
853
884
int i ;
854
885
int cntlofreq = 0 ;
855
- for (i = 0 ; i < data -> acpi_data . state_count ; i ++ ) {
886
+ for (i = 0 ; i < data -> acpi_data -> state_count ; i ++ ) {
856
887
u32 fid ;
857
888
u32 vid ;
858
889
859
890
if (data -> exttype ) {
860
- fid = data -> acpi_data . states [i ].status & EXT_FID_MASK ;
861
- vid = (data -> acpi_data . states [i ].status >> VID_SHIFT ) & EXT_VID_MASK ;
891
+ fid = data -> acpi_data -> states [i ].status & EXT_FID_MASK ;
892
+ vid = (data -> acpi_data -> states [i ].status >> VID_SHIFT ) & EXT_VID_MASK ;
862
893
} else {
863
- fid = data -> acpi_data . states [i ].control & FID_MASK ;
864
- vid = (data -> acpi_data . states [i ].control >> VID_SHIFT ) & VID_MASK ;
894
+ fid = data -> acpi_data -> states [i ].control & FID_MASK ;
895
+ vid = (data -> acpi_data -> states [i ].control >> VID_SHIFT ) & VID_MASK ;
865
896
}
866
897
867
898
dprintk (" %d : fid 0x%x, vid 0x%x\n" , i , fid , vid );
@@ -902,10 +933,10 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
902
933
cntlofreq = i ;
903
934
}
904
935
905
- if (powernow_table [i ].frequency != (data -> acpi_data . states [i ].core_frequency * 1000 )) {
936
+ if (powernow_table [i ].frequency != (data -> acpi_data -> states [i ].core_frequency * 1000 )) {
906
937
printk (KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n" ,
907
938
powernow_table [i ].frequency ,
908
- (unsigned int ) (data -> acpi_data . states [i ].core_frequency * 1000 ));
939
+ (unsigned int ) (data -> acpi_data -> states [i ].core_frequency * 1000 ));
909
940
powernow_table [i ].frequency = CPUFREQ_ENTRY_INVALID ;
910
941
continue ;
911
942
}
@@ -915,11 +946,12 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
915
946
916
947
static void powernow_k8_cpu_exit_acpi (struct powernow_k8_data * data )
917
948
{
918
- if (data -> acpi_data . state_count )
919
- acpi_processor_unregister_performance (& data -> acpi_data , data -> cpu );
949
+ if (data -> acpi_data -> state_count )
950
+ acpi_processor_unregister_performance (data -> acpi_data , data -> cpu );
920
951
}
921
952
922
953
#else
954
+ static int powernow_k8_cpu_preinit_acpi (void ) { return - ENODEV ; }
923
955
static int powernow_k8_cpu_init_acpi (struct powernow_k8_data * data ) { return - ENODEV ; }
924
956
static void powernow_k8_cpu_exit_acpi (struct powernow_k8_data * data ) { return ; }
925
957
static void powernow_k8_acpi_pst_values (struct powernow_k8_data * data , unsigned int index ) { return ; }
@@ -1104,7 +1136,7 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
1104
1136
static int __cpuinit powernowk8_cpu_init (struct cpufreq_policy * pol )
1105
1137
{
1106
1138
struct powernow_k8_data * data ;
1107
- cpumask_t oldmask ;
1139
+ cpumask_t oldmask = CPU_MASK_ALL ;
1108
1140
int rc ;
1109
1141
1110
1142
if (!cpu_online (pol -> cpu ))
@@ -1177,10 +1209,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
1177
1209
/* run on any CPU again */
1178
1210
set_cpus_allowed_ptr (current , & oldmask );
1179
1211
1180
- if (cpu_family == CPU_HW_PSTATE )
1181
- pol -> cpus = cpumask_of_cpu (pol -> cpu );
1182
- else
1183
- pol -> cpus = per_cpu (cpu_core_map , pol -> cpu );
1212
+ pol -> cpus = data -> starting_core_affinity ;
1184
1213
data -> available_cores = & (pol -> cpus );
1185
1214
1186
1215
/* Take a crude guess here.
@@ -1303,6 +1332,7 @@ static int __cpuinit powernowk8_init(void)
1303
1332
}
1304
1333
1305
1334
if (supported_cpus == num_online_cpus ()) {
1335
+ powernow_k8_cpu_preinit_acpi ();
1306
1336
printk (KERN_INFO PFX "Found %d %s "
1307
1337
"processors (%d cpu cores) (" VERSION ")\n" ,
1308
1338
num_online_nodes (),
@@ -1319,6 +1349,10 @@ static void __exit powernowk8_exit(void)
1319
1349
dprintk ("exit\n" );
1320
1350
1321
1351
cpufreq_unregister_driver (& cpufreq_amd64_driver );
1352
+
1353
+ #ifdef CONFIG_X86_POWERNOW_K8_ACPI
1354
+ free_percpu (acpi_perf_data );
1355
+ #endif
1322
1356
}
1323
1357
1324
1358
MODULE_AUTHOR ("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>" );
0 commit comments