29
29
#include <stdlib.h>
30
30
#include <stdio.h>
31
31
#include <string.h>
32
+ #include <errno.h>
33
+ #include <limits.h>
32
34
33
35
#include "intel_gpu_tools.h"
36
+
34
37
#define NUM_ELEMENTS (array ) (sizeof(array) / sizeof(array[0]))
35
38
36
39
/* XXX PCH only today */
@@ -44,7 +47,7 @@ static void reg_write(uint32_t reg, uint32_t val)
44
47
{
45
48
* (volatile uint32_t * )((volatile char * )mmio + reg ) = val ;
46
49
}
47
-
50
+
48
51
static int brightness_levels [] = {1 , 2 , 4 , 6 , 9 , 12 , 16 , 20 , 25 , 30 , 36 , 43 ,
49
52
51 , 60 , 70 , 80 , 90 , 100 };
50
53
@@ -66,33 +69,69 @@ static int brightness_decr(int curr)
66
69
return brightness_levels [i ];
67
70
}
68
71
72
+ void print_usage () {
73
+ printf ("Usage: intel_backlight [incr|decr|n] where n is brightness in percent\n" );
74
+ }
75
+
69
76
int main (int argc , char * * argv )
70
77
{
71
78
uint32_t current , max , min ;
79
+ uint32_t currentReg , maxReg ;
72
80
int result ;
73
81
74
82
intel_get_mmio (intel_get_pci_device ());
75
83
76
84
current = reg_read (BLC_PWM_CPU_CTL ) & BACKLIGHT_DUTY_CYCLE_MASK ;
77
85
max = reg_read (BLC_PWM_PCH_CTL2 ) >> 16 ;
78
86
87
+ intel_check_pch ();
88
+
89
+ switch ( pch )
90
+ {
91
+ case PCH_LPT :
92
+ case PCH_SPT :
93
+ case PCH_KBP :
94
+ currentReg = 0xc8254 ;
95
+ maxReg = 0xc8254 ;
96
+ break ;
97
+
98
+ default :
99
+ currentReg = BLC_PWM_CPU_CTL ;
100
+ maxReg = BLC_PWM_PCH_CTL2 ;
101
+ break ;
102
+ }
103
+
104
+ current = reg_read (currentReg ) & BACKLIGHT_DUTY_CYCLE_MASK ;
105
+ max = reg_read (maxReg ) >> 16 ;
106
+
79
107
min = 0.5 + 0.5 * max / 100.0 ; // 0.5%
80
108
/*
81
- printf ("min: %d, NUM_ELEMENTS(brightness_levels): %d\n", min,
109
+ printf ("min: %d, NUM_ELEMENTS(brightness_levels): %d\n", min,
82
110
NUM_ELEMENTS(brightness_levels));
83
111
*/
84
112
result = 0.5 + current * 100.0 / max ;
85
- printf ("current backlight value: %d%% (%d/%d)\n" , result , current , max );
86
-
113
+ printf ("Current backlight value: %d%% (%d/%d)\n" , result , current , max );
114
+
87
115
if (argc > 1 ) {
88
116
uint32_t v ;
89
- if (0 == strcmp (argv [1 ], "incr" ))
117
+ if (0 == strcmp (argv [1 ], "incr" ))
90
118
v = 0.5 + brightness_incr (result ) * max / 100.0 ;
91
119
else if (0 == strcmp (argv [1 ], "decr" ))
92
120
v = 0.5 + brightness_decr (result ) * max / 100.0 ;
93
- else
94
- v = 0.5 + atoi (argv [1 ]) * max / 100.0 ;
95
- /*
121
+ else {
122
+ errno = 0 ;
123
+ char * endptr ;
124
+ long val = strtol (argv [1 ], & endptr , 10 );
125
+
126
+ if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN ))
127
+ || (errno != 0 && val == 0 ) || endptr == argv [1 ]) {
128
+ print_usage ();
129
+ return result ;
130
+ }
131
+
132
+ v = 0.5 + val * max / 100.0 ;
133
+ }
134
+ /*
96
135
printf("v: %d\n", v);
97
136
*/
98
137
if (v < min )
@@ -102,10 +141,12 @@ int main(int argc, char** argv)
102
141
reg_write (BLC_PWM_CPU_CTL ,
103
142
(reg_read (BLC_PWM_CPU_CTL ) & ~ BACKLIGHT_DUTY_CYCLE_MASK ) | v );
104
143
(void ) reg_read (BLC_PWM_CPU_CTL );
144
+
145
+ reg_write (currentReg ,
146
+ (reg_read (currentReg ) & ~ BACKLIGHT_DUTY_CYCLE_MASK ) | v );
147
+ (void ) reg_read (currentReg );
105
148
result = 0.5 + v * 100.0 / max ;
106
149
printf ("set backlight to %d%% (%d/%d)\n" , result , v , max );
107
150
}
108
-
109
151
return result ;
110
152
}
111
-
0 commit comments