~ubuntu-branches/ubuntu/trusty/grub2/trusty

« back to all changes in this revision

Viewing changes to grub-core/kern/mips/loongson/init.c

  • Committer: Package Import Robot
  • Author(s): Colin Watson
  • Date: 2014-01-16 15:18:04 UTC
  • mfrom: (17.6.38 experimental)
  • Revision ID: package-import@ubuntu.com-20140116151804-3foouk7fpqcq3sxx
Tags: 2.02~beta2-2
* Convert patch handling to git-dpm.
* Add bi-endian support to ELF parser (Tomohiro B Berry).
* Adjust restore_mkdevicemap.patch to mark get_kfreebsd_version as static,
  to appease "gcc -Werror=missing-prototypes".
* Cherry-pick from upstream:
  - Change grub-macbless' manual page section to 8.
* Install grub-glue-efi, grub-macbless, grub-render-label, and
  grub-syslinux2cfg.
* grub-shell: Pass -no-pad to xorriso when building floppy images.

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
#include <grub/at_keyboard.h>
41
41
 
42
42
grub_err_t
43
 
grub_machine_mmap_iterate (grub_memory_hook_t hook)
 
43
grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
44
44
{
45
45
  hook (GRUB_ARCH_LOWMEMPSTART, grub_arch_memsize << 20,
46
 
        GRUB_MEMORY_AVAILABLE);
 
46
        GRUB_MEMORY_AVAILABLE, hook_data);
47
47
  hook (GRUB_ARCH_HIGHMEMPSTART, grub_arch_highmemsize << 20,
48
 
        GRUB_MEMORY_AVAILABLE);
 
48
        GRUB_MEMORY_AVAILABLE, hook_data);
49
49
  return GRUB_ERR_NONE;
50
50
}
51
51
 
 
52
/* Helper for init_pci.  */
 
53
static int
 
54
set_card (grub_pci_device_t dev, grub_pci_id_t pciid,
 
55
          void *data __attribute__ ((unused)))
 
56
{
 
57
  grub_pci_address_t addr;
 
58
  /* We could use grub_pci_assign_addresses for this but we prefer to
 
59
     have exactly same memory map as on pmon.  */
 
60
  switch (pciid)
 
61
    {
 
62
    case GRUB_LOONGSON_OHCI_PCIID:
 
63
      addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
 
64
      grub_pci_write (addr, 0x5025000);
 
65
      addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
 
66
      grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
 
67
                           | GRUB_PCI_COMMAND_PARITY_ERROR
 
68
                           | GRUB_PCI_COMMAND_BUS_MASTER
 
69
                           | GRUB_PCI_COMMAND_MEM_ENABLED);
 
70
 
 
71
      addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
 
72
      grub_pci_write_word (addr, 0x0200 | GRUB_PCI_STATUS_CAPABILITIES);
 
73
      break;
 
74
    case GRUB_LOONGSON_EHCI_PCIID:
 
75
      addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
 
76
      grub_pci_write (addr, 0x5026000);
 
77
      addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
 
78
      grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
 
79
                           | GRUB_PCI_COMMAND_PARITY_ERROR
 
80
                           | GRUB_PCI_COMMAND_BUS_MASTER
 
81
                           | GRUB_PCI_COMMAND_MEM_ENABLED);
 
82
 
 
83
      addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
 
84
      grub_pci_write_word (addr, (1 << GRUB_PCI_STATUS_DEVSEL_TIMING_SHIFT)
 
85
                           | GRUB_PCI_STATUS_CAPABILITIES);
 
86
      break;
 
87
    }
 
88
  return 0;
 
89
}
 
90
 
52
91
static void
53
92
init_pci (void)
54
93
{
55
 
  auto int NESTED_FUNC_ATTR set_card (grub_pci_device_t dev, grub_pci_id_t pciid);
56
 
  int NESTED_FUNC_ATTR set_card (grub_pci_device_t dev, grub_pci_id_t pciid)
57
 
  {
58
 
    grub_pci_address_t addr;
59
 
    /* FIXME: autoscan for BARs and devices.  */
60
 
    switch (pciid)
61
 
      {
62
 
      case GRUB_LOONGSON_OHCI_PCIID:
63
 
        addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
64
 
        grub_pci_write (addr, 0x5025000);
65
 
        addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
66
 
        grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
67
 
                             | GRUB_PCI_COMMAND_PARITY_ERROR
68
 
                             | GRUB_PCI_COMMAND_BUS_MASTER
69
 
                             | GRUB_PCI_COMMAND_MEM_ENABLED);
70
 
 
71
 
        addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
72
 
        grub_pci_write_word (addr, 0x0200 | GRUB_PCI_STATUS_CAPABILITIES);
73
 
        break;
74
 
      case GRUB_LOONGSON_EHCI_PCIID:
75
 
        addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
76
 
        grub_pci_write (addr, 0x5026000);
77
 
        addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
78
 
        grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
79
 
                             | GRUB_PCI_COMMAND_PARITY_ERROR
80
 
                             | GRUB_PCI_COMMAND_BUS_MASTER
81
 
                             | GRUB_PCI_COMMAND_MEM_ENABLED);
82
 
 
83
 
        addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
84
 
        grub_pci_write_word (addr, (1 << GRUB_PCI_STATUS_DEVSEL_TIMING_SHIFT)
85
 
                             | GRUB_PCI_STATUS_CAPABILITIES);
86
 
        break;
87
 
      }
88
 
    return 0;
89
 
  }
90
 
 
91
94
  *((volatile grub_uint32_t *) GRUB_CPU_LOONGSON_PCI_HIT1_SEL_LO) = 0x8000000c;
92
95
  *((volatile grub_uint32_t *) GRUB_CPU_LOONGSON_PCI_HIT1_SEL_HI) = 0xffffffff;
93
96
 
110
113
  *((volatile grub_uint32_t *) (GRUB_MACHINE_PCI_CONTROLLER_HEADER 
111
114
                                + GRUB_PCI_REG_ADDRESS_REG1)) = 0;
112
115
 
113
 
  grub_pci_iterate (set_card);
 
116
  grub_pci_iterate (set_card, NULL);
114
117
}
115
118
 
116
119
void
126
129
      /* Loongson 2E.  */
127
130
    case 0x6302:
128
131
      grub_arch_machine = GRUB_ARCH_MACHINE_FULOONG2E;
 
132
      grub_bonito_type = GRUB_BONITO_2F;
129
133
      break;
130
134
      /* Loongson 2F.  */
131
135
    case 0x6303:
132
136
      if (grub_arch_machine != GRUB_ARCH_MACHINE_FULOONG2F
133
137
          && grub_arch_machine != GRUB_ARCH_MACHINE_YEELOONG)
134
138
        grub_arch_machine = GRUB_ARCH_MACHINE_YEELOONG;
 
139
      grub_bonito_type = GRUB_BONITO_2F;
 
140
      break;
 
141
      /* Loongson 3A. */
 
142
    case 0x6305:
 
143
      grub_arch_machine = GRUB_ARCH_MACHINE_YEELOONG_3A;
 
144
      grub_bonito_type = GRUB_BONITO_3A;
135
145
      break;
136
146
    }
137
147
 
200
210
  grub_video_sm712_init ();
201
211
  grub_video_sis315pro_init ();
202
212
  grub_video_radeon_fuloong2e_init ();
 
213
  grub_video_radeon_yeeloong3a_init ();
203
214
  grub_font_init ();
204
215
  grub_gfxterm_init ();
205
216
 
206
217
  grub_keylayouts_init ();
207
 
  if (grub_arch_machine == GRUB_ARCH_MACHINE_YEELOONG)
 
218
  if (grub_arch_machine == GRUB_ARCH_MACHINE_YEELOONG
 
219
      || grub_arch_machine == GRUB_ARCH_MACHINE_YEELOONG_3A)
208
220
    grub_at_keyboard_init ();
209
221
 
210
222
  grub_terminfo_init ();
214
226
}
215
227
 
216
228
void
217
 
grub_machine_fini (void)
218
 
{
 
229
grub_machine_fini (int flags __attribute__ ((unused)))
 
230
{
 
231
}
 
232
 
 
233
static int
 
234
halt_via (grub_pci_device_t dev, grub_pci_id_t pciid,
 
235
          void *data __attribute__ ((unused)))
 
236
{
 
237
  grub_uint16_t pm;
 
238
  grub_pci_address_t addr;
 
239
 
 
240
  if (pciid != 0x30571106)
 
241
    return 0;
 
242
 
 
243
  addr = grub_pci_make_address (dev, 0x40);
 
244
  pm = grub_pci_read (addr) & ~1;
 
245
 
 
246
  if (pm == 0)
 
247
    {
 
248
      grub_pci_write (addr, 0x1801);
 
249
      pm = 0x1800;
 
250
    }
 
251
 
 
252
  addr = grub_pci_make_address (dev, 0x80);
 
253
  grub_pci_write_byte (addr, 0xff);
 
254
 
 
255
  addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
 
256
  grub_pci_write_word (addr, grub_pci_read_word (addr) | GRUB_PCI_COMMAND_IO_ENABLED);
 
257
 
 
258
  /* FIXME: This one is derived from qemu. Check on real hardware.  */
 
259
  grub_outw (0x2000, pm + 4 + GRUB_MACHINE_PCI_IO_BASE);
 
260
  grub_millisleep (5000);
 
261
 
 
262
  return 0;
219
263
}
220
264
 
221
265
void
224
268
  switch (grub_arch_machine)
225
269
    {
226
270
    case GRUB_ARCH_MACHINE_FULOONG2E:
 
271
      grub_pci_iterate (halt_via, NULL);
227
272
      break;
228
273
    case GRUB_ARCH_MACHINE_FULOONG2F:
229
274
      {
244
289
                 & ~GRUB_CPU_YEELOONG_SHUTDOWN_GPIO, GRUB_CPU_LOONGSON_GPIOCFG);
245
290
      grub_millisleep (1500);
246
291
      break;
 
292
    case GRUB_ARCH_MACHINE_YEELOONG_3A:
 
293
      grub_millisleep (1);
 
294
      grub_outb (0x4e, GRUB_MACHINE_PCI_IO_BASE_3A | 0x66);
 
295
      grub_millisleep (1);
 
296
      grub_outb (2, GRUB_MACHINE_PCI_IO_BASE_3A | 0x62);
 
297
      grub_millisleep (5000);
 
298
      break;
247
299
    }
248
300
 
249
301
  grub_puts_ (N_("Shutdown failed"));
257
309
  grub_halt ();
258
310
}
259
311
 
 
312
void
 
313
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
 
314
                               char **path __attribute__ ((unused)))
 
315
{
 
316
}
 
317
 
260
318
extern char _end[];
261
319
grub_addr_t grub_modbase = (grub_addr_t) _end;
262
320