@@ -1583,3 +1583,132 @@ void virtio_gpu_cmd_set_scaling(struct virtio_gpu_device *vgdev,
15831583
15841584 virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
15851585}
1586+
1587+ int virtio_gpu_cmd_backlight_update_status (struct virtio_gpu_device * vgdev ,
1588+ uint32_t backlight_id )
1589+ {
1590+ struct virtio_gpu_backlight_update_status * cmd_p ;
1591+ struct virtio_gpu_vbuffer * vbuf ;
1592+
1593+ if (backlight_id >= vgdev -> num_backlight ) {
1594+ return - EINVAL ;
1595+ }
1596+ cmd_p = virtio_gpu_alloc_cmd (vgdev , & vbuf , sizeof (* cmd_p ));
1597+ memset (cmd_p , 0 , sizeof (* cmd_p ));
1598+ cmd_p -> hdr .type = cpu_to_le32 (VIRTIO_GPU_CMD_BACKLIGHT_UPDATE_STATUS );
1599+ cmd_p -> backlight_id = cpu_to_le32 (backlight_id );
1600+ cmd_p -> brightness = cpu_to_le32 (vgdev -> backlight [backlight_id ].brightness );
1601+ cmd_p -> power = cpu_to_le32 (vgdev -> backlight [backlight_id ].power );
1602+
1603+ virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
1604+ virtio_gpu_notify (vgdev );
1605+ return 0 ;
1606+ }
1607+
1608+ static void virtio_gpu_cmd_get_backlightness_cb (struct virtio_gpu_device * vgdev ,
1609+ struct virtio_gpu_vbuffer * vbuf )
1610+ {
1611+ struct virtio_gpu_get_brightness * cmd_p =
1612+ (struct virtio_gpu_get_brightness * )vbuf -> buf ;
1613+ struct virtio_gpu_resp_brightness * resp =
1614+ (struct virtio_gpu_resp_brightness * )vbuf -> resp_buf ;
1615+ int32_t brightness = le32_to_cpu (resp -> brightness );
1616+ uint32_t backlight_id = cmd_p -> backlight_id ;
1617+ if (backlight_id < vgdev -> num_backlight ) {
1618+ vgdev -> backlight [backlight_id ].brightness = brightness ;
1619+ }
1620+ complete (& vbuf -> notify );
1621+ }
1622+
1623+ int virtio_gpu_cmd_get_brightness (struct virtio_gpu_device * vgdev ,
1624+ uint32_t backlight_id )
1625+ {
1626+ struct virtio_gpu_get_brightness * cmd_p ;
1627+ struct virtio_gpu_vbuffer * vbuf ;
1628+ void * resp_buf ;
1629+ int ret = 0 ;
1630+
1631+ if (backlight_id >= vgdev -> num_backlight )
1632+ return - EINVAL ;
1633+ resp_buf = kzalloc (sizeof (struct virtio_gpu_resp_brightness ),
1634+ GFP_KERNEL );
1635+ if (!resp_buf )
1636+ return - ENOMEM ;
1637+
1638+ cmd_p = virtio_gpu_alloc_cmd_resp
1639+ (vgdev , & virtio_gpu_cmd_get_backlightness_cb , & vbuf ,
1640+ sizeof (* cmd_p ), sizeof (struct virtio_gpu_resp_brightness ),
1641+ resp_buf );
1642+ memset (cmd_p , 0 , sizeof (* cmd_p ));
1643+
1644+ init_completion (& vbuf -> notify );
1645+ cmd_p -> hdr .type = cpu_to_le32 (VIRTIO_GPU_CMD_BACKLIGHT_GET );
1646+ cmd_p -> backlight_id = backlight_id ;
1647+ virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
1648+ virtio_gpu_notify (vgdev );
1649+ ret = wait_for_completion_interruptible_timeout (& vbuf -> notify , 100 * HZ );
1650+ if (ret <= 0 )
1651+ return - ETIME ;
1652+ return 0 ;
1653+ }
1654+
1655+ static void virtio_gpu_cmd_get_backlight_info_cb (struct virtio_gpu_device * vgdev ,
1656+ struct virtio_gpu_vbuffer * vbuf )
1657+ {
1658+ struct virtio_gpu_get_backlight_info * cmd_p =
1659+ (struct virtio_gpu_get_backlight_info * )vbuf -> buf ;
1660+ struct virtio_gpu_resp_backlight_info * resp =
1661+ (struct virtio_gpu_resp_backlight_info * )vbuf -> resp_buf ;
1662+ int32_t brightness = le32_to_cpu (resp -> brightness );
1663+ int32_t max_brightness = le32_to_cpu (resp -> max_brightness );
1664+ int32_t power = le32_to_cpu (resp -> power );
1665+ int32_t type = le32_to_cpu (resp -> type );
1666+ int32_t scale = le32_to_cpu (resp -> scale );
1667+ uint32_t backlight_id = cmd_p -> backlight_id ;
1668+ if (backlight_id < vgdev -> num_backlight ) {
1669+ vgdev -> backlight [backlight_id ].brightness = brightness ;
1670+ vgdev -> backlight [backlight_id ].max_brightness = max_brightness ;
1671+ vgdev -> backlight [backlight_id ].power = power ;
1672+ if (type > 0 && type < BACKLIGHT_TYPE_MAX )
1673+ vgdev -> backlight [backlight_id ].type = type ;
1674+ else
1675+ vgdev -> backlight [backlight_id ].type = BACKLIGHT_RAW ;
1676+ if (scale >= BACKLIGHT_SCALE_UNKNOWN && scale <= BACKLIGHT_SCALE_NON_LINEAR )
1677+ vgdev -> backlight [backlight_id ].scale = scale ;
1678+ else
1679+ vgdev -> backlight [backlight_id ].scale = BACKLIGHT_SCALE_UNKNOWN ;
1680+ }
1681+ complete (& vbuf -> notify );
1682+ }
1683+
1684+ int virtio_gpu_cmd_backlight_query (struct virtio_gpu_device * vgdev ,
1685+ uint32_t backlight_id )
1686+ {
1687+ struct virtio_gpu_get_backlight_info * cmd_p ;
1688+ struct virtio_gpu_vbuffer * vbuf ;
1689+ void * resp_buf ;
1690+ int ret = 0 ;
1691+
1692+ if (backlight_id >= vgdev -> num_backlight )
1693+ return - EINVAL ;
1694+ resp_buf = kzalloc (sizeof (struct virtio_gpu_resp_backlight_info ),
1695+ GFP_KERNEL );
1696+ if (!resp_buf )
1697+ return - ENOMEM ;
1698+
1699+ cmd_p = virtio_gpu_alloc_cmd_resp
1700+ (vgdev , & virtio_gpu_cmd_get_backlight_info_cb , & vbuf ,
1701+ sizeof (* cmd_p ), sizeof (struct virtio_gpu_resp_backlight_info ),
1702+ resp_buf );
1703+ init_completion (& vbuf -> notify );
1704+ memset (cmd_p , 0 , sizeof (* cmd_p ));
1705+
1706+ cmd_p -> hdr .type = cpu_to_le32 (VIRTIO_GPU_CMD_BACKLIGHT_QUERY );
1707+ cmd_p -> backlight_id = backlight_id ;
1708+ virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
1709+ virtio_gpu_notify (vgdev );
1710+ ret = wait_for_completion_interruptible_timeout (& vbuf -> notify , 100 * HZ );
1711+ if (ret <= 0 )
1712+ return - ETIME ;
1713+ return 0 ;
1714+ }
0 commit comments