Control intel backlight on FreeBSD (and OpenBSD)
openbsd

add suport for gen8/broadwell backlight setting

tested on:
vga1 at pci0 dev 2 function 0 "Intel HD Graphics 5300" rev 0x09

+20 -5
+20 -5
intel_backlight.c
··· 69 69 int main(int argc, char** argv) 70 70 { 71 71 uint32_t current, max, min; 72 + struct pci_device *dev; 72 73 int result; 73 74 74 - intel_get_mmio(intel_get_pci_device()); 75 + dev = intel_get_pci_device(); 76 + intel_get_mmio(dev); 75 77 76 - current = reg_read(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; 78 + if (IS_GEN8(dev->device_id)) /* broadwell */ 79 + current = reg_read(BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK; 80 + else 81 + current = reg_read(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; 82 + 77 83 max = reg_read(BLC_PWM_PCH_CTL2) >> 16; 78 84 79 85 min = 0.5 + 0.5 * max / 100.0; // 0.5% ··· 99 105 v = min; 100 106 else if (v > max) 101 107 v = max; 102 - reg_write(BLC_PWM_CPU_CTL, 103 - (reg_read(BLC_PWM_CPU_CTL) &~ BACKLIGHT_DUTY_CYCLE_MASK) | v); 104 - (void) reg_read(BLC_PWM_CPU_CTL); 108 + 109 + if (IS_GEN8(dev->device_id)) { 110 + reg_write(BLC_PWM_PCH_CTL2, 111 + (reg_read(BLC_PWM_PCH_CTL2) &~ 112 + BACKLIGHT_DUTY_CYCLE_MASK) | v); 113 + (void) reg_read(BLC_PWM_PCH_CTL2); 114 + } else { 115 + reg_write(BLC_PWM_CPU_CTL, 116 + (reg_read(BLC_PWM_CPU_CTL) &~ 117 + BACKLIGHT_DUTY_CYCLE_MASK) | v); 118 + (void) reg_read(BLC_PWM_CPU_CTL); 119 + } 105 120 result = 0.5 + v * 100.0 / max; 106 121 printf ("set backlight to %d%% (%d/%d)\n", result, v, max); 107 122 }