27
27
#include <grub/video_fb.h>
28
28
#include <grub/pci.h>
30
#include "sm712_init.c"
32
#define GRUB_SM712_TOTAL_MEMORY_SPACE 0x700400
32
36
struct grub_video_mode_info mode_info;
33
37
struct grub_video_render_target *render_target;
35
unsigned int bytes_per_scan_line;
36
unsigned int bytes_per_pixel;
40
41
grub_uint32_t base;
41
42
grub_pci_device_t dev;
103
105
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
105
if (found && framebuffer.base == 0)
107
/* FIXME: change framebuffer base */
110
107
/* Fill mode info details. */
111
108
framebuffer.mode_info.width = 1024;
112
109
framebuffer.mode_info.height = 600;
124
121
framebuffer.mode_info.reserved_mask_size = 0;
125
122
framebuffer.mode_info.reserved_field_pos = 0;
126
123
framebuffer.mode_info.blit_format = grub_video_get_blit_format (&framebuffer.mode_info);
125
if (found && framebuffer.base == 0)
127
grub_pci_address_t addr;
128
/* FIXME: choose address dynamically if needed. */
129
framebuffer.base = 0x04000000;
131
addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_ADDRESS_REG0);
132
grub_pci_write (addr, framebuffer.base);
135
addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_CACHELINE);
136
grub_pci_write (addr, 0x8);
138
/* Enable address spaces. */
139
addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_COMMAND);
140
grub_pci_write (addr, 0x7);
127
143
/* We can safely discard volatile attribute. */
128
framebuffer.ptr = (void *) grub_pci_device_map_range (framebuffer.dev,
145
= (void *) grub_pci_device_map_range (framebuffer.dev,
147
GRUB_SM712_TOTAL_MEMORY_SPACE);
131
148
framebuffer.mapped = 1;
150
/* Initialise SM712. */
151
grub_outb (0x18, GRUB_MACHINE_PCI_IO_BASE + 0x3c4);
152
grub_outb (0x11, GRUB_MACHINE_PCI_IO_BASE + 0x3c5);
154
/* Prevent garbage from appearing on the screen. */
155
grub_memset (framebuffer.ptr, 0,
156
framebuffer.mode_info.height * framebuffer.mode_info.pitch);
158
for (i = 0; i < ARRAY_SIZE (sm712_init); i++)
159
switch (sm712_init[i].directive)
162
*(volatile grub_uint8_t *) ((char *) framebuffer.ptr
163
+ sm712_init[i].addr) = sm712_init[i].val;
167
grub_uint8_t val = *(volatile grub_uint8_t *)
168
((char *) framebuffer.ptr + sm712_init[i].addr);
173
*(volatile grub_uint16_t *) ((char *) framebuffer.ptr
174
+ sm712_init[i].addr) = sm712_init[i].val;
177
*(volatile grub_uint32_t *) ((char *) framebuffer.ptr
178
+ sm712_init[i].addr) = sm712_init[i].val;
133
182
err = grub_video_fb_create_render_target_from_pointer (&framebuffer.render_target, &framebuffer.mode_info, framebuffer.ptr);
149
198
static grub_err_t
150
grub_video_sm712_set_palette (unsigned int start, unsigned int count,
151
struct grub_video_palette_data *palette_data)
153
if (framebuffer.index_color_mode)
155
/* TODO: Implement setting indexed color mode palette to hardware. */
158
/* Then set color to emulated palette. */
159
return grub_video_fb_set_palette (start, count, palette_data);
163
199
grub_video_sm712_swap_buffers (void)
165
201
/* TODO: Implement buffer swapping. */
193
229
.name = "SM712 Video Driver",
194
230
.id = GRUB_VIDEO_DRIVER_SM712,
232
.prio = GRUB_VIDEO_ADAPTER_PRIO_NATIVE,
196
234
.init = grub_video_sm712_video_init,
197
235
.fini = grub_video_sm712_video_fini,
198
236
.setup = grub_video_sm712_setup,
199
237
.get_info = grub_video_fb_get_info,
200
238
.get_info_and_fini = grub_video_sm712_get_info_and_fini,
201
.set_palette = grub_video_sm712_set_palette,
239
.set_palette = grub_video_fb_set_palette,
202
240
.get_palette = grub_video_fb_get_palette,
203
241
.set_viewport = grub_video_fb_set_viewport,
204
242
.get_viewport = grub_video_fb_get_viewport,