@@ -1416,3 +1416,132 @@ void virtio_gpu_cmd_set_scaling(struct virtio_gpu_device *vgdev,
14161416
14171417 virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
14181418}
1419+
1420+ int virtio_gpu_cmd_backlight_update_status (struct virtio_gpu_device * vgdev ,
1421+ uint32_t backlight_id )
1422+ {
1423+ struct virtio_gpu_backlight_update_status * cmd_p ;
1424+ struct virtio_gpu_vbuffer * vbuf ;
1425+
1426+ if (backlight_id >= vgdev -> num_backlight ) {
1427+ return - EINVAL ;
1428+ }
1429+ cmd_p = virtio_gpu_alloc_cmd (vgdev , & vbuf , sizeof (* cmd_p ));
1430+ memset (cmd_p , 0 , sizeof (* cmd_p ));
1431+ cmd_p -> hdr .type = cpu_to_le32 (VIRTIO_GPU_CMD_BACKLIGHT_UPDATE_STATUS );
1432+ cmd_p -> backlight_id = cpu_to_le32 (backlight_id );
1433+ cmd_p -> brightness = cpu_to_le32 (vgdev -> backlight [backlight_id ].brightness );
1434+ cmd_p -> power = cpu_to_le32 (vgdev -> backlight [backlight_id ].power );
1435+
1436+ virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
1437+ virtio_gpu_notify (vgdev );
1438+ return 0 ;
1439+ }
1440+
1441+ static void virtio_gpu_cmd_get_backlightness_cb (struct virtio_gpu_device * vgdev ,
1442+ struct virtio_gpu_vbuffer * vbuf )
1443+ {
1444+ struct virtio_gpu_get_brightness * cmd_p =
1445+ (struct virtio_gpu_get_brightness * )vbuf -> buf ;
1446+ struct virtio_gpu_resp_brightness * resp =
1447+ (struct virtio_gpu_resp_brightness * )vbuf -> resp_buf ;
1448+ int32_t brightness = le32_to_cpu (resp -> brightness );
1449+ uint32_t backlight_id = cmd_p -> backlight_id ;
1450+ if (backlight_id < vgdev -> num_backlight ) {
1451+ vgdev -> backlight [backlight_id ].brightness = brightness ;
1452+ }
1453+ complete (& vbuf -> notify );
1454+ }
1455+
1456+ int virtio_gpu_cmd_get_brightness (struct virtio_gpu_device * vgdev ,
1457+ uint32_t backlight_id )
1458+ {
1459+ struct virtio_gpu_get_brightness * cmd_p ;
1460+ struct virtio_gpu_vbuffer * vbuf ;
1461+ void * resp_buf ;
1462+ int ret = 0 ;
1463+
1464+ if (backlight_id >= vgdev -> num_backlight )
1465+ return - EINVAL ;
1466+ resp_buf = kzalloc (sizeof (struct virtio_gpu_resp_brightness ),
1467+ GFP_KERNEL );
1468+ if (!resp_buf )
1469+ return - ENOMEM ;
1470+
1471+ cmd_p = virtio_gpu_alloc_cmd_resp
1472+ (vgdev , & virtio_gpu_cmd_get_backlightness_cb , & vbuf ,
1473+ sizeof (* cmd_p ), sizeof (struct virtio_gpu_resp_brightness ),
1474+ resp_buf );
1475+ memset (cmd_p , 0 , sizeof (* cmd_p ));
1476+
1477+ init_completion (& vbuf -> notify );
1478+ cmd_p -> hdr .type = cpu_to_le32 (VIRTIO_GPU_CMD_BACKLIGHT_GET );
1479+ cmd_p -> backlight_id = backlight_id ;
1480+ virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
1481+ virtio_gpu_notify (vgdev );
1482+ ret = wait_for_completion_interruptible_timeout (& vbuf -> notify , 100 * HZ );
1483+ if (ret <= 0 )
1484+ return - ETIME ;
1485+ return 0 ;
1486+ }
1487+
1488+ static void virtio_gpu_cmd_get_backlight_info_cb (struct virtio_gpu_device * vgdev ,
1489+ struct virtio_gpu_vbuffer * vbuf )
1490+ {
1491+ struct virtio_gpu_get_backlight_info * cmd_p =
1492+ (struct virtio_gpu_get_backlight_info * )vbuf -> buf ;
1493+ struct virtio_gpu_resp_backlight_info * resp =
1494+ (struct virtio_gpu_resp_backlight_info * )vbuf -> resp_buf ;
1495+ int32_t brightness = le32_to_cpu (resp -> brightness );
1496+ int32_t max_brightness = le32_to_cpu (resp -> max_brightness );
1497+ int32_t power = le32_to_cpu (resp -> power );
1498+ int32_t type = le32_to_cpu (resp -> type );
1499+ int32_t scale = le32_to_cpu (resp -> scale );
1500+ uint32_t backlight_id = cmd_p -> backlight_id ;
1501+ if (backlight_id < vgdev -> num_backlight ) {
1502+ vgdev -> backlight [backlight_id ].brightness = brightness ;
1503+ vgdev -> backlight [backlight_id ].max_brightness = max_brightness ;
1504+ vgdev -> backlight [backlight_id ].power = power ;
1505+ if (type > 0 && type < BACKLIGHT_TYPE_MAX )
1506+ vgdev -> backlight [backlight_id ].type = type ;
1507+ else
1508+ vgdev -> backlight [backlight_id ].type = BACKLIGHT_RAW ;
1509+ if (scale >= BACKLIGHT_SCALE_UNKNOWN && scale <= BACKLIGHT_SCALE_NON_LINEAR )
1510+ vgdev -> backlight [backlight_id ].scale = scale ;
1511+ else
1512+ vgdev -> backlight [backlight_id ].scale = BACKLIGHT_SCALE_UNKNOWN ;
1513+ }
1514+ complete (& vbuf -> notify );
1515+ }
1516+
1517+ int virtio_gpu_cmd_backlight_query (struct virtio_gpu_device * vgdev ,
1518+ uint32_t backlight_id )
1519+ {
1520+ struct virtio_gpu_get_backlight_info * cmd_p ;
1521+ struct virtio_gpu_vbuffer * vbuf ;
1522+ void * resp_buf ;
1523+ int ret = 0 ;
1524+
1525+ if (backlight_id >= vgdev -> num_backlight )
1526+ return - EINVAL ;
1527+ resp_buf = kzalloc (sizeof (struct virtio_gpu_resp_backlight_info ),
1528+ GFP_KERNEL );
1529+ if (!resp_buf )
1530+ return - ENOMEM ;
1531+
1532+ cmd_p = virtio_gpu_alloc_cmd_resp
1533+ (vgdev , & virtio_gpu_cmd_get_backlight_info_cb , & vbuf ,
1534+ sizeof (* cmd_p ), sizeof (struct virtio_gpu_resp_backlight_info ),
1535+ resp_buf );
1536+ init_completion (& vbuf -> notify );
1537+ memset (cmd_p , 0 , sizeof (* cmd_p ));
1538+
1539+ cmd_p -> hdr .type = cpu_to_le32 (VIRTIO_GPU_CMD_BACKLIGHT_QUERY );
1540+ cmd_p -> backlight_id = backlight_id ;
1541+ virtio_gpu_queue_ctrl_buffer (vgdev , vbuf );
1542+ virtio_gpu_notify (vgdev );
1543+ ret = wait_for_completion_interruptible_timeout (& vbuf -> notify , 100 * HZ );
1544+ if (ret <= 0 )
1545+ return - ETIME ;
1546+ return 0 ;
1547+ }
0 commit comments