Re: macppc: fix wsconsctl for non-vgafb

2020-10-27 Thread Klemens Nanni
On Mon, Oct 26, 2020 at 06:20:25PM +0100, Tobias Heider wrote:
> The diff below wires the ofw backlight commands to ws_get_param/ws_set_param
> and makes wsconsctl backlight/brightness work on my machine using radeondrm. 
This commit fixed brightness on my PowerBook5,8 but broke
display.contract in that wsconsctl(8) not fails for this knob:

# wsconsctl display.contrast
wsconsctl: WSDISPLAYIO_GETPARAM: Operation not permitted
display.contrast=0.00%
# wsconsctl display.contrast
wsconsctl: WSDISPLAYIO_GETPARAM: Operation not permitted
display.contrast=4294967293.4294967293%



Re: macppc: fix wsconsctl for non-vgafb

2020-10-26 Thread Mark Kettenis
> Date: Mon, 26 Oct 2020 18:20:25 +0100
> From: Tobias Heider 
> 
> Hi,
> 
> i am trying to get backlight and brightness control running on my
> Powerbook G4.  Both can be controlled via ofw.
> The vgafb(4) video driver currently directly calls of_setbrightness() directly
> instead of relying on wscons, DRM users are out of luck.
> 
> The diff below wires the ofw backlight commands to ws_get_param/ws_set_param
> and makes wsconsctl backlight/brightness work on my machine using radeondrm. 
> 
> ok?

ok kettenis@

> Index: ofw_machdep.c
> ===
> RCS file: /cvs/src/sys/arch/macppc/macppc/ofw_machdep.c,v
> retrieving revision 1.59
> diff -u -p -r1.59 ofw_machdep.c
> --- ofw_machdep.c 25 May 2020 09:55:48 -  1.59
> +++ ofw_machdep.c 26 Oct 2020 17:04:48 -
> @@ -61,6 +61,7 @@
>  #endif
>  
>  #if NWSDISPLAY > 0
> +#include 
>  #include 
>  #include 
>  #endif
> @@ -108,6 +109,9 @@ int   save_ofw_mapping(void);
>  void ofw_consinit(int);
>  void ofw_read_mem_regions(int, int, int);
>  
> +int  ofw_set_param(struct wsdisplay_param *);
> +int  ofw_get_param(struct wsdisplay_param *);
> +
>  /*
>   * This is called during initppc, before the system is really initialized.
>   * It shall provide the total and the available regions of RAM.
> @@ -267,6 +271,7 @@ save_ofw_mapping(void)
>  }
>  
>  static int display_ofh;
> +int cons_backlight;
>  int cons_brightness;
>  int cons_backlight_available;
>  int fbnode;
> @@ -472,6 +477,11 @@ of_display_console(void)
>   if (OF_getnodebyname(0, "backlight") != 0) {
>   cons_backlight_available = 1;
>   cons_brightness = MAX_BRIGHTNESS;
> + cons_backlight = WSDISPLAYIO_VIDEO_ON;
> + 
> + /* wsconsctl hooks */
> + ws_get_param = ofw_get_param;
> + ws_set_param = ofw_set_param;
>   }
>  
>  #if 1
> @@ -536,6 +546,8 @@ of_setbacklight(int on)
>   if (cons_backlight_available == 0)
>   return;
>  
> + cons_backlight = on;
> +
>   if (on)
>   OF_call_method_1("backlight-on", display_ofh, 0);
>   else
> @@ -637,3 +649,53 @@ ofw_consinit(int chosen)
>   cn_tab = cp;
>  }
>  
> +int
> +ofw_set_param(struct wsdisplay_param *dp)
> +{
> + switch (dp->param) {
> + case WSDISPLAYIO_PARAM_BRIGHTNESS:
> + if (cons_backlight_available != 0) {
> + of_setbrightness(dp->curval);
> + return 0;
> + }
> + break;
> + case WSDISPLAYIO_PARAM_BACKLIGHT:
> + if (cons_backlight_available != 0) {
> + of_setbacklight(dp->curval ? WSDISPLAYIO_VIDEO_ON
> + : WSDISPLAYIO_VIDEO_OFF);
> + return 0;
> + }
> + break;
> + default:
> + break;
> + }
> +
> + return -1;
> +}
> +
> +int
> +ofw_get_param(struct wsdisplay_param *dp)
> +{
> + switch (dp->param) {
> + case WSDISPLAYIO_PARAM_BRIGHTNESS:
> + if (cons_backlight_available != 0) {
> + dp->min = MIN_BRIGHTNESS;
> + dp->max = MAX_BRIGHTNESS;
> + dp->curval = cons_brightness;
> + return 0;
> + }
> + break;
> + case WSDISPLAYIO_PARAM_BACKLIGHT:
> + if (cons_backlight_available != 0) {
> + dp->min = 0;
> + dp->max = 1;
> + dp->curval = cons_backlight;
> + return 0;
> + }
> + break;
> + default:
> + break;
> + }
> +
> + return 1;
> +}
> 
>