Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
ops.cpp
Go to the documentation of this file.
1
3#include <str.h>
4
6 uintptr_t cmd_phys = 0;
8 (struct virtio_gpu_ctrl_hdr*) IOUtils::DMAAlloc(sizeof(*cmd),
9 &cmd_phys);
10
11 cmd->ctx_id = 0;
13 cmd->flags = 0;
14 cmd->fence_id = 0;
15 cmd->padding = 0;
16
17 uintptr_t resp_phys = 0;
18 struct virtio_gpu_resp_display_info* resp =
19 (struct virtio_gpu_resp_display_info*) IOUtils::DMAAlloc(
20 sizeof(*resp), &resp_phys);
21
22 memset(resp, 0, sizeof(*resp));
23
24 log(mod, "Sending GET_DISPLAY_INFO command");
25 if (virtio_gpu_send_command((void*) cmd_phys, sizeof(*cmd),
26 (void*) resp_phys, sizeof(*resp))
27 < 0) {
28 log(mod, "Failed to send GET_DISPLAY_INFO command");
29 return -1;
30 }
31
33 log(mod, "Bad response type: 0x%x (expected 0x%x)",
35 return -1;
36 }
37
38 log(mod, "Display info received:");
39 int enabled_count = 0;
40 for (int i = 0; i < 16; i++) {
41 if (resp->pmodes[i].enabled) {
42 log(mod, " Scanout %d: %dx%d at (%d,%d)", i,
43 resp->pmodes[i].rect.width,
44 resp->pmodes[i].rect.height, resp->pmodes[i].rect.x,
45 resp->pmodes[i].rect.y);
46 enabled_count++;
47 }
48 }
49
50 if (enabled_count == 0) {
51 log(mod, "No enabled display modes found");
52 }
53
54 return 0;
55}
56
59
60 uintptr_t cmd_phys = 0;
62 (struct virtio_gpu_resource_create_2d*) IOUtils::DMAAlloc(
63 sizeof(*cmd), &cmd_phys);
64
66 cmd->hdr.flags = 0;
67 cmd->hdr.fence_id = 0;
68 cmd->hdr.ctx_id = 0;
69 cmd->hdr.padding = 0;
70 cmd->resource_id = resource_id;
72 cmd->width = width;
73 cmd->height = height;
74
75 uintptr_t resp_phys = 0;
76 struct virtio_gpu_ctrl_hdr* resp =
77 (struct virtio_gpu_ctrl_hdr*) IOUtils::DMAAlloc(sizeof(*resp),
78 &resp_phys);
79
80 memset(resp, 0, sizeof(*resp));
81
82 log(mod, "Creating resource %d: %dx%d", resource_id, width, height);
83 if (virtio_gpu_send_command((void*) cmd_phys, sizeof(*cmd),
84 (void*) resp_phys, sizeof(*resp))
85 < 0) {
86 log(mod, "Failed to create resource");
87 return -1;
88 }
89
90 if (resp->type != VIRTIO_GPU_RESP_OK_NODATA) {
91 log(mod, "Resource create failed: 0x%x", resp->type);
92 return -1;
93 }
94
95 log(mod, "Resource %d created: %dx%d", resource_id, width, height);
96 return 0;
97}
const char * mod
Definition ioforge.hpp:65
int virtio_gpu_get_display_info()
Definition ops.cpp:5
int virtio_gpu_create_resource(uint32_t resource_id, uint32_t width, uint32_t height)
Definition ops.cpp:57
int virtio_gpu_send_command(void *cmd, uint32_t cmd_size, void *resp, uint32_t resp_size)
volatile uint8_t cmd
Definition e1000.hpp:3
#define log(mod, fmt,...)
Definition ioforge.hpp:12
void memset(void *ptr, int value, size_t num)
struct virtio_gpu_resp_display_info::virtio_gpu_display_one pmodes[16]
struct virtio_gpu_ctrl_hdr hdr
unsigned int uint32_t
Definition type.h:19
unsigned long uintptr_t
Definition type.h:73
#define VIRTIO_GPU_RESP_OK_NODATA
#define VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM
uint32_t width
Definition virtio-gpu.hpp:2
uint32_t height
Definition virtio-gpu.hpp:3
#define VIRTIO_GPU_RESP_OK_DISPLAY_INFO
uint32_t resource_id
Definition virtio-gpu.hpp:1
#define VIRTIO_GPU_CMD_GET_DISPLAY_INFO
#define VIRTIO_GPU_CMD_RESOURCE_CREATE_2D