|
36 | 36 | #define MAX_PSTATE_SHIFT 32 |
37 | 37 | #define LPSTATE_SHIFT 48 |
38 | 38 | #define GPSTATE_SHIFT 56 |
| 39 | +#define MAX_NR_CHIPS 32 |
39 | 40 |
|
40 | 41 | #define MAX_RAMP_DOWN_TIME 5120 |
41 | 42 | /* |
@@ -1046,35 +1047,46 @@ static int init_chip_info(void) |
1046 | 1047 | unsigned int *chip; |
1047 | 1048 | unsigned int cpu, i; |
1048 | 1049 | unsigned int prev_chip_id = UINT_MAX; |
| 1050 | + cpumask_t *chip_cpu_mask; |
1049 | 1051 | int ret = 0; |
1050 | 1052 |
|
1051 | 1053 | chip = kcalloc(num_possible_cpus(), sizeof(*chip), GFP_KERNEL); |
1052 | 1054 | if (!chip) |
1053 | 1055 | return -ENOMEM; |
1054 | 1056 |
|
| 1057 | + /* Allocate a chip cpu mask large enough to fit mask for all chips */ |
| 1058 | + chip_cpu_mask = kcalloc(MAX_NR_CHIPS, sizeof(cpumask_t), GFP_KERNEL); |
| 1059 | + if (!chip_cpu_mask) { |
| 1060 | + ret = -ENOMEM; |
| 1061 | + goto free_and_return; |
| 1062 | + } |
| 1063 | + |
1055 | 1064 | for_each_possible_cpu(cpu) { |
1056 | 1065 | unsigned int id = cpu_to_chip_id(cpu); |
1057 | 1066 |
|
1058 | 1067 | if (prev_chip_id != id) { |
1059 | 1068 | prev_chip_id = id; |
1060 | 1069 | chip[nr_chips++] = id; |
1061 | 1070 | } |
| 1071 | + cpumask_set_cpu(cpu, &chip_cpu_mask[nr_chips-1]); |
1062 | 1072 | } |
1063 | 1073 |
|
1064 | 1074 | chips = kcalloc(nr_chips, sizeof(struct chip), GFP_KERNEL); |
1065 | 1075 | if (!chips) { |
1066 | 1076 | ret = -ENOMEM; |
1067 | | - goto free_and_return; |
| 1077 | + goto out_free_chip_cpu_mask; |
1068 | 1078 | } |
1069 | 1079 |
|
1070 | 1080 | for (i = 0; i < nr_chips; i++) { |
1071 | 1081 | chips[i].id = chip[i]; |
1072 | | - cpumask_copy(&chips[i].mask, cpumask_of_node(chip[i])); |
| 1082 | + cpumask_copy(&chips[i].mask, &chip_cpu_mask[i]); |
1073 | 1083 | INIT_WORK(&chips[i].throttle, powernv_cpufreq_work_fn); |
1074 | 1084 | for_each_cpu(cpu, &chips[i].mask) |
1075 | 1085 | per_cpu(chip_info, cpu) = &chips[i]; |
1076 | 1086 | } |
1077 | 1087 |
|
| 1088 | +out_free_chip_cpu_mask: |
| 1089 | + kfree(chip_cpu_mask); |
1078 | 1090 | free_and_return: |
1079 | 1091 | kfree(chip); |
1080 | 1092 | return ret; |
|
0 commit comments