#include <grub/video_fb.h>
#include <grub/pci.h>
#include <grub/vga.h>
+#include <grub/cache.h>
#define GRUB_SIS315PRO_PCIID 0x03251039
#define GRUB_SIS315PRO_TOTAL_MEMORY_SPACE 0x800000
static struct
{
struct grub_video_mode_info mode_info;
- struct grub_video_render_target *render_target;
grub_uint8_t *ptr;
+ volatile grub_uint8_t *direct_ptr;
int mapped;
grub_uint32_t base;
grub_uint32_t mmiobase;
grub_video_sis315pro_video_fini (void)
{
if (framebuffer.mapped)
- grub_pci_device_unmap_range (framebuffer.dev, framebuffer.ptr,
- GRUB_SIS315PRO_TOTAL_MEMORY_SPACE);
+ {
+ grub_pci_device_unmap_range (framebuffer.dev, framebuffer.ptr,
+ GRUB_SIS315PRO_TOTAL_MEMORY_SPACE);
+ grub_pci_device_unmap_range (framebuffer.dev, framebuffer.direct_ptr,
+ GRUB_SIS315PRO_TOTAL_MEMORY_SPACE);
+ }
return grub_video_fb_fini ();
}
#include "sis315_init.c"
+#ifndef TEST
+/* Helper for grub_video_sis315pro_setup. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ int *found = data;
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
+ || pciid != GRUB_SIS315PRO_PCIID)
+ return 0;
+
+ *found = 1;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
+ framebuffer.mmiobase = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG2);
+ framebuffer.io = (grub_pci_read (addr) & GRUB_PCI_ADDR_IO_MASK)
+ + GRUB_MACHINE_PCI_IO_BASE;
+ framebuffer.dev = dev;
+
+ return 1;
+}
+#endif
+
static grub_err_t
grub_video_sis315pro_setup (unsigned int width, unsigned int height,
unsigned int mode_type,
unsigned i;
#ifndef TEST
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)));
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)))
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
- || pciid != GRUB_SIS315PRO_PCIID)
- return 0;
-
- found = 1;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
- framebuffer.mmiobase = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG2);
- framebuffer.io = (grub_pci_read (addr) & GRUB_PCI_ADDR_IO_MASK)
- + GRUB_MACHINE_PCI_IO_BASE;
- framebuffer.dev = dev;
-
- return 1;
- }
-
/* Decode depth from mode_type. If it is zero, then autodetect. */
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
if ((width != 640 && width != 0) || (height != 480 && height != 0)
|| (depth != 8 && depth != 0))
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
- "Only 640x400x8 is supported");
+ "Only 640x480x8 is supported");
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, &found);
if (!found)
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
#endif
/* Fill mode info details. */
framebuffer.mode_info.width = 640;
framebuffer.mode_info.height = 480;
- framebuffer.mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
+ framebuffer.mode_info.mode_type = (GRUB_VIDEO_MODE_TYPE_INDEX_COLOR
+ | GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED
+ | GRUB_VIDEO_MODE_TYPE_UPDATING_SWAP);
framebuffer.mode_info.bpp = 8;
framebuffer.mode_info.bytes_per_pixel = 1;
framebuffer.mode_info.pitch = 640 * 1;
/* We can safely discard volatile attribute. */
#ifndef TEST
framebuffer.ptr
- = (void *) grub_pci_device_map_range (framebuffer.dev,
- framebuffer.base,
- GRUB_SIS315PRO_TOTAL_MEMORY_SPACE);
+ = grub_pci_device_map_range_cached (framebuffer.dev,
+ framebuffer.base,
+ GRUB_SIS315PRO_TOTAL_MEMORY_SPACE);
+ framebuffer.direct_ptr
+ = grub_pci_device_map_range (framebuffer.dev,
+ framebuffer.base,
+ GRUB_SIS315PRO_TOTAL_MEMORY_SPACE);
framebuffer.mmioptr = grub_pci_device_map_range (framebuffer.dev,
framebuffer.mmiobase,
GRUB_SIS315PRO_MMIO_SPACE);
/* Prevent garbage from appearing on the screen. */
grub_memset (framebuffer.ptr, 0,
framebuffer.mode_info.height * framebuffer.mode_info.pitch);
+ grub_arch_sync_dma_caches (framebuffer.ptr,
+ framebuffer.mode_info.height
+ * framebuffer.mode_info.pitch);
#endif
grub_outb (GRUB_VGA_IO_MISC_NEGATIVE_VERT_POLARITY
#endif
#ifndef TEST
- err = grub_video_fb_create_render_target_from_pointer (&framebuffer
- .render_target,
- &framebuffer.mode_info,
- framebuffer.ptr);
-
- if (err)
- return err;
-
- err = grub_video_fb_set_active_render_target (framebuffer.render_target);
-
+ err = grub_video_fb_setup (mode_type, mode_mask,
+ &framebuffer.mode_info,
+ framebuffer.ptr, NULL, NULL);
if (err)
return err;
static grub_err_t
grub_video_sis315pro_swap_buffers (void)
{
- /* TODO: Implement buffer swapping. */
+ grub_size_t s;
+ s = (framebuffer.mode_info.height
+ * framebuffer.mode_info.pitch
+ * framebuffer.mode_info.bytes_per_pixel);
+ grub_video_fb_swap_buffers ();
+ grub_arch_sync_dma_caches (framebuffer.ptr, s);
return GRUB_ERR_NONE;
}
-static grub_err_t
-grub_video_sis315pro_set_active_render_target (struct grub_video_render_target *target)
-{
- if (target == GRUB_VIDEO_RENDER_TARGET_DISPLAY)
- target = framebuffer.render_target;
-
- return grub_video_fb_set_active_render_target (target);
-}
-
static grub_err_t
grub_video_sis315pro_get_info_and_fini (struct grub_video_mode_info *mode_info,
void **framebuf)
{
grub_memcpy (mode_info, &(framebuffer.mode_info), sizeof (*mode_info));
- *framebuf = (char *) framebuffer.ptr;
+ *framebuf = (void *) framebuffer.direct_ptr;
grub_video_fb_fini ();
.swap_buffers = grub_video_sis315pro_swap_buffers,
.create_render_target = grub_video_fb_create_render_target,
.delete_render_target = grub_video_fb_delete_render_target,
- .set_active_render_target = grub_video_sis315pro_set_active_render_target,
+ .set_active_render_target = grub_video_fb_set_active_render_target,
.get_active_render_target = grub_video_fb_get_active_render_target,
.next = 0
};
+#ifdef GRUB_MACHINE_MIPS_LOONGSON
+void grub_video_sis315pro_init (void)
+#else
GRUB_MOD_INIT(video_sis315pro)
+#endif
{
grub_video_register (&grub_video_sis315pro_adapter);
}
+#ifdef GRUB_MACHINE_MIPS_LOONGSON
+void grub_video_sis315pro_fini (void)
+#else
GRUB_MOD_FINI(video_sis315pro)
+#endif
{
grub_video_unregister (&grub_video_sis315pro_adapter);
}