|
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 | /* |
@@ -1051,35 +1052,46 @@ static int init_chip_info(void) |
1051 | 1052 | unsigned int *chip; |
1052 | 1053 | unsigned int cpu, i; |
1053 | 1054 | unsigned int prev_chip_id = UINT_MAX; |
| 1055 | + cpumask_t *chip_cpu_mask; |
1054 | 1056 | int ret = 0; |
1055 | 1057 |
|
1056 | 1058 | chip = kcalloc(num_possible_cpus(), sizeof(*chip), GFP_KERNEL); |
1057 | 1059 | if (!chip) |
1058 | 1060 | return -ENOMEM; |
1059 | 1061 |
|
| 1062 | + /* Allocate a chip cpu mask large enough to fit mask for all chips */ |
| 1063 | + chip_cpu_mask = kcalloc(MAX_NR_CHIPS, sizeof(cpumask_t), GFP_KERNEL); |
| 1064 | + if (!chip_cpu_mask) { |
| 1065 | + ret = -ENOMEM; |
| 1066 | + goto free_and_return; |
| 1067 | + } |
| 1068 | + |
1060 | 1069 | for_each_possible_cpu(cpu) { |
1061 | 1070 | unsigned int id = cpu_to_chip_id(cpu); |
1062 | 1071 |
|
1063 | 1072 | if (prev_chip_id != id) { |
1064 | 1073 | prev_chip_id = id; |
1065 | 1074 | chip[nr_chips++] = id; |
1066 | 1075 | } |
| 1076 | + cpumask_set_cpu(cpu, &chip_cpu_mask[nr_chips-1]); |
1067 | 1077 | } |
1068 | 1078 |
|
1069 | 1079 | chips = kcalloc(nr_chips, sizeof(struct chip), GFP_KERNEL); |
1070 | 1080 | if (!chips) { |
1071 | 1081 | ret = -ENOMEM; |
1072 | | - goto free_and_return; |
| 1082 | + goto out_free_chip_cpu_mask; |
1073 | 1083 | } |
1074 | 1084 |
|
1075 | 1085 | for (i = 0; i < nr_chips; i++) { |
1076 | 1086 | chips[i].id = chip[i]; |
1077 | | - cpumask_copy(&chips[i].mask, cpumask_of_node(chip[i])); |
| 1087 | + cpumask_copy(&chips[i].mask, &chip_cpu_mask[i]); |
1078 | 1088 | INIT_WORK(&chips[i].throttle, powernv_cpufreq_work_fn); |
1079 | 1089 | for_each_cpu(cpu, &chips[i].mask) |
1080 | 1090 | per_cpu(chip_info, cpu) = &chips[i]; |
1081 | 1091 | } |
1082 | 1092 |
|
| 1093 | +out_free_chip_cpu_mask: |
| 1094 | + kfree(chip_cpu_mask); |
1083 | 1095 | free_and_return: |
1084 | 1096 | kfree(chip); |
1085 | 1097 | return ret; |
|
0 commit comments