~ubuntu-branches/debian/stretch/grub2/stretch

« back to all changes in this revision

Viewing changes to video/sm712.c

Tags: upstream-1.98+20100705
ImportĀ upstreamĀ versionĀ 1.98+20100705

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <grub/video_fb.h>
28
28
#include <grub/pci.h>
29
29
 
 
30
#include "sm712_init.c"
 
31
 
 
32
#define GRUB_SM712_TOTAL_MEMORY_SPACE  0x700400
 
33
 
30
34
static struct
31
35
{
32
36
  struct grub_video_mode_info mode_info;
33
37
  struct grub_video_render_target *render_target;
34
38
 
35
 
  unsigned int bytes_per_scan_line;
36
 
  unsigned int bytes_per_pixel;
37
39
  grub_uint8_t *ptr;
38
 
  int index_color_mode;
39
40
  int mapped;
40
41
  grub_uint32_t base;
41
42
  grub_pci_device_t dev;
55
56
{
56
57
  if (framebuffer.mapped)
57
58
    grub_pci_device_unmap_range (framebuffer.dev, framebuffer.ptr,
58
 
                                 1024 * 600 * 2);
 
59
                                 GRUB_SM712_TOTAL_MEMORY_SPACE);
59
60
 
60
61
  return grub_video_fb_fini ();
61
62
}
67
68
  int depth;
68
69
  grub_err_t err;
69
70
  int found = 0;
 
71
  unsigned i;
70
72
 
71
73
  auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)));
72
74
  int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)))
102
104
  if (!found)
103
105
    return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
104
106
 
105
 
  if (found && framebuffer.base == 0)
106
 
    {
107
 
      /* FIXME: change framebuffer base */
108
 
    }
109
 
 
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);
 
124
 
 
125
  if (found && framebuffer.base == 0)
 
126
    {
 
127
      grub_pci_address_t addr;
 
128
      /* FIXME: choose address dynamically if needed.   */
 
129
      framebuffer.base = 0x04000000;
 
130
 
 
131
      addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_ADDRESS_REG0);
 
132
      grub_pci_write (addr, framebuffer.base);
 
133
 
 
134
      /* Set latency.  */
 
135
      addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_CACHELINE);
 
136
      grub_pci_write (addr, 0x8);
 
137
 
 
138
      /* Enable address spaces.  */
 
139
      addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_COMMAND);
 
140
      grub_pci_write (addr, 0x7);
 
141
    }
 
142
 
127
143
  /* We can safely discard volatile attribute.  */
128
 
  framebuffer.ptr = (void *) grub_pci_device_map_range (framebuffer.dev,
129
 
                                                        framebuffer.base,
130
 
                                                        1024 * 600 * 2);
 
144
  framebuffer.ptr
 
145
    = (void *) grub_pci_device_map_range (framebuffer.dev,
 
146
                                          framebuffer.base,
 
147
                                          GRUB_SM712_TOTAL_MEMORY_SPACE);
131
148
  framebuffer.mapped = 1;
132
149
 
 
150
  /* Initialise SM712.  */
 
151
  grub_outb (0x18, GRUB_MACHINE_PCI_IO_BASE + 0x3c4);
 
152
  grub_outb (0x11, GRUB_MACHINE_PCI_IO_BASE + 0x3c5);
 
153
 
 
154
  /* Prevent garbage from appearing on the screen.  */
 
155
  grub_memset (framebuffer.ptr, 0, 
 
156
               framebuffer.mode_info.height * framebuffer.mode_info.pitch);
 
157
 
 
158
  for (i = 0; i < ARRAY_SIZE (sm712_init); i++)
 
159
    switch (sm712_init[i].directive)
 
160
      {
 
161
      case 1:
 
162
        *(volatile grub_uint8_t *) ((char *) framebuffer.ptr 
 
163
                                    + sm712_init[i].addr) = sm712_init[i].val;
 
164
        break;
 
165
      case -1:
 
166
        {
 
167
          grub_uint8_t val = *(volatile grub_uint8_t *) 
 
168
            ((char *) framebuffer.ptr + sm712_init[i].addr);
 
169
          (void) val;
 
170
        }
 
171
        break;
 
172
      case 2:
 
173
        *(volatile grub_uint16_t *) ((char *) framebuffer.ptr 
 
174
                                     + sm712_init[i].addr) = sm712_init[i].val;
 
175
        break;
 
176
      case 4:
 
177
        *(volatile grub_uint32_t *) ((char *) framebuffer.ptr 
 
178
                                     + sm712_init[i].addr) = sm712_init[i].val;
 
179
        break;
 
180
      }
 
181
 
133
182
  err = grub_video_fb_create_render_target_from_pointer (&framebuffer.render_target, &framebuffer.mode_info, framebuffer.ptr);
134
183
 
135
184
  if (err)
147
196
}
148
197
 
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)
152
 
{
153
 
  if (framebuffer.index_color_mode)
154
 
    {
155
 
      /* TODO: Implement setting indexed color mode palette to hardware.  */
156
 
    }
157
 
 
158
 
  /* Then set color to emulated palette.  */
159
 
  return grub_video_fb_set_palette (start, count, palette_data);
160
 
}
161
 
 
162
 
static grub_err_t
163
199
grub_video_sm712_swap_buffers (void)
164
200
{
165
201
  /* TODO: Implement buffer swapping.  */
193
229
    .name = "SM712 Video Driver",
194
230
    .id = GRUB_VIDEO_DRIVER_SM712,
195
231
 
 
232
    .prio = GRUB_VIDEO_ADAPTER_PRIO_NATIVE,
 
233
 
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,