diff --git a/sys/powerpc/cpufreq/pmcr.c b/sys/powerpc/cpufreq/pmcr.c
index 03cb4cde371f..681e053444d5 100644
--- a/sys/powerpc/cpufreq/pmcr.c
+++ b/sys/powerpc/cpufreq/pmcr.c
@@ -174,6 +174,7 @@ pmcr_settings(device_t dev, struct cf_setting *sets, int *count)
 	for (i = 0; i < npstates; i++) {
 		sets[i].freq = pstate_freqs[i];
 		sets[i].spec[0] = pstate_ids[i];
+		sets[i].spec[1] = i;
 		sets[i].dev = dev;
 	}
 	*count = npstates;
@@ -189,13 +190,11 @@ pmcr_set(device_t dev, const struct cf_setting *set)
 	if (set == NULL)
 		return (EINVAL);
 
-	if (set->spec[0] < 0 || set->spec[0] > npstates)
+	if (set->spec[1] < 0 || set->spec[1] >= npstates)
 		return (EINVAL);
 
-	pmcr = ((long)pstate_ids[set->spec[0]] << PMCR_LOWERPS_SHIFT) &
-	    PMCR_LOWERPS_MASK;
-	pmcr |= ((long)pstate_ids[set->spec[0]] << PMCR_UPPERPS_SHIFT) &
-	    PMCR_UPPERPS_MASK;
+	pmcr = ((long)set->spec[0] << PMCR_LOWERPS_SHIFT) & PMCR_LOWERPS_MASK;
+	pmcr |= ((long)set->spec[0] << PMCR_UPPERPS_SHIFT) & PMCR_UPPERPS_MASK;
 	pmcr |= PMCR_VERSION_1;
 
 	mtspr(SPR_PMCR, pmcr);
@@ -228,6 +227,7 @@ pmcr_get(device_t dev, struct cf_setting *set)
 		return (EINVAL);
 
 	set->spec[0] = pstate;
+	set->spec[1] = i;
 	set->freq = pstate_freqs[i];
 
 	set->dev = dev;