drm/nv50/pm: mostly nailed down fan pwm frequency selection
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
		
							parent
							
								
									11b7d89521
								
							
						
					
					
						commit
						3f8e11e4b6
					
				| @ -524,6 +524,7 @@ struct nouveau_pm_memtimings { | ||||
| struct nouveau_pm_fan { | ||||
| 	u32 min_duty; | ||||
| 	u32 max_duty; | ||||
| 	u32 pwm_freq; | ||||
| }; | ||||
| 
 | ||||
| struct nouveau_pm_engine { | ||||
|  | ||||
| @ -206,13 +206,12 @@ nouveau_perf_init(struct drm_device *dev) | ||||
| 		if (version < 0x40) { | ||||
| 			recordlen = perf[3] + (perf[4] * perf[5]); | ||||
| 			entries   = perf[2]; | ||||
| 
 | ||||
| 			pm->pwm_divisor = ROM16(perf[6]); | ||||
| 		} else { | ||||
| 			recordlen = perf[2] + (perf[3] * perf[4]); | ||||
| 			entries   = perf[5]; | ||||
| 		} | ||||
| 
 | ||||
| 		if (version < 0x30) | ||||
| 			pm->pwm_divisor = ROM16(perf[6]); | ||||
| 	} else { | ||||
| 		if (bios->data[bios->offset + 6] < 0x25) { | ||||
| 			legacy_perf_init(dev); | ||||
|  | ||||
| @ -164,6 +164,9 @@ nouveau_temp_vbios_parse(struct drm_device *dev, u8 *temp) | ||||
| 			pm->fan.min_duty = value & 0xff; | ||||
| 			pm->fan.max_duty = (value & 0xff00) >> 8; | ||||
| 			break; | ||||
| 		case 0x26: | ||||
| 			pm->fan.pwm_freq = value; | ||||
| 			break; | ||||
| 		} | ||||
| 		temp += recordlen; | ||||
| 	} | ||||
|  | ||||
| @ -201,6 +201,8 @@ nv50_pm_fanspeed_get(struct drm_device *dev) | ||||
| int | ||||
| nv50_pm_fanspeed_set(struct drm_device *dev, int percent) | ||||
| { | ||||
| 	struct drm_nouveau_private *dev_priv = dev->dev_private; | ||||
| 	struct nouveau_pm_engine *pm = &dev_priv->engine.pm; | ||||
| 	struct pwm_info pwm; | ||||
| 	u32 divs, duty; | ||||
| 	int ret; | ||||
| @ -209,12 +211,20 @@ nv50_pm_fanspeed_set(struct drm_device *dev, int percent) | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	divs = nv_rd32(dev, 0x00e114 + (pwm.id * 8)); | ||||
| 	divs = pm->pwm_divisor; | ||||
| 	if (pm->fan.pwm_freq) { | ||||
| 		/*XXX: PNVIO clock more than likely... */ | ||||
| 		divs = 1350000 / pm->fan.pwm_freq; | ||||
| 		if (dev_priv->chipset < 0xa3) | ||||
| 			divs /= 4; | ||||
| 	} | ||||
| 
 | ||||
| 	duty = ((divs * percent) + 99) / 100; | ||||
| 	if (pwm.invert) | ||||
| 		duty = divs - duty; | ||||
| 
 | ||||
| 	nv_mask(dev, pwm.ctrl, 0x00010001 << pwm.line, 0x00000001 << pwm.line); | ||||
| 	nv_wr32(dev, 0x00e114 + (pwm.id * 8), divs); | ||||
| 	nv_wr32(dev, 0x00e118 + (pwm.id * 8), 0x80000000 | duty); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user