]> git.proxmox.com Git - grub2.git/blobdiff - grub-core/video/sis315pro.c
Remove nested functions from PCI iterators.
[grub2.git] / grub-core / video / sis315pro.c
index 22064c91e9986d1a883c391de91ec0ac92bacfa1..a986669447adfe6960168e850da2112b13b2c7fe 100644 (file)
@@ -27,6 +27,7 @@
 #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
@@ -35,9 +36,9 @@
 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;
@@ -74,8 +75,12 @@ static grub_err_t
 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 ();
 }
@@ -83,6 +88,37 @@ grub_video_sis315pro_video_fini (void)
 
 #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,
@@ -94,33 +130,6 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
   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;
@@ -128,16 +137,18 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
   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;
@@ -192,9 +203,13 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
   /* 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);
@@ -205,6 +220,9 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
   /* 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
@@ -347,16 +365,9 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
 #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;
 
@@ -372,25 +383,21 @@ grub_video_sis315pro_setup (unsigned int width, unsigned int height,
 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 ();
 
@@ -424,18 +431,26 @@ static struct grub_video_adapter grub_video_sis315pro_adapter =
     .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);
 }