40
40
#include <grub/at_keyboard.h>
43
grub_machine_mmap_iterate (grub_memory_hook_t hook)
43
grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
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;
52
/* Helper for init_pci. */
54
set_card (grub_pci_device_t dev, grub_pci_id_t pciid,
55
void *data __attribute__ ((unused)))
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. */
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);
71
addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
72
grub_pci_write_word (addr, 0x0200 | GRUB_PCI_STATUS_CAPABILITIES);
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);
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);
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)
58
grub_pci_address_t addr;
59
/* FIXME: autoscan for BARs and devices. */
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);
71
addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
72
grub_pci_write_word (addr, 0x0200 | GRUB_PCI_STATUS_CAPABILITIES);
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);
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);
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;
217
grub_machine_fini (void)
229
grub_machine_fini (int flags __attribute__ ((unused)))
234
halt_via (grub_pci_device_t dev, grub_pci_id_t pciid,
235
void *data __attribute__ ((unused)))
238
grub_pci_address_t addr;
240
if (pciid != 0x30571106)
243
addr = grub_pci_make_address (dev, 0x40);
244
pm = grub_pci_read (addr) & ~1;
248
grub_pci_write (addr, 0x1801);
252
addr = grub_pci_make_address (dev, 0x80);
253
grub_pci_write_byte (addr, 0xff);
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);
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);