bal printhex
move $a0, $t4
- /* Initialise SMBus controller. */
lui $t0, %hi(GRUB_MACHINE_PCI_CONFSPACE)
li $t1, GRUB_CS5536_MSR_MAILBOX_CONFIG_ENABLED
sw $t1, (%lo(GRUB_MACHINE_PCI_CONFSPACE) + GRUB_CS5536_MSR_MAILBOX_CONFIG) ($t0)
ori $a2, $zero, ((GRUB_CS5536_LBAR_MASK_MASK \
| GRUB_CS5536_LBAR_ENABLE) >> 32)
+ bal gpio_init
+ nop
+
+ /* Initialise SMBus controller. */
/* Set SMBUS LBAR. */
lui $a0, %hi(GRUB_CS5536_MSR_SMB_BAR)
addiu $a0, $a0, %lo(GRUB_CS5536_MSR_SMB_BAR)
bal message
addiu $a0, $a0, %lo(smbus_enabled)
- /* Enable SMBus controller pins. */
- lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO)
- ori $t1, $zero, GRUB_GPIO_SMBUS_PINS
- sw $t1, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO + GRUB_GPIO_REG_OUT_EN) ($t0)
- sw $t1, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO + GRUB_GPIO_REG_OUT_AUX1) ($t0)
- sw $t1, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO + GRUB_GPIO_REG_IN_EN) ($t0)
- sw $t1, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO + GRUB_GPIO_REG_IN_AUX1) ($t0)
-
lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS)
/* Disable SMB. */
b fatal
addiu $a0, $a0, %lo(unhandled_exception)
+gpio_init:
+ lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO)
+ addiu $t0, $t0, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO)
+ lui $t1, %hi (gpio_dump)
+ addiu $t1, $t1, %lo (gpio_dump)
+
+1:
+ lw $t2, 0($t1)
+ sw $t2, 0($t0)
+ addiu $t0, $t0, 4
+ addiu $t1, $t1, 4
+ lui $t2, %hi (gpio_dump_end)
+ addiu $t2, $t2, %lo (gpio_dump_end)
+ bne $t1, $t2, 1b
+ nop
+ jr $ra
+ nop
+
/* Same as similarly named C function but in asm since
we need it early. */
/* In: none. Out: none. Clobbered: $t0, $t1, $a0. */
.quad 0 /* 1b */
.quad 0 /* 1c */
+/* Dump of GPIO connections. FIXME: Remove useless and macroify. */
+gpio_dump:
+#ifdef FULOONG
+ .long 0xffff0000, 0x2eefd110, 0xffff0000, 0xffff0000
+ .long 0x2eefd110, 0xffff0000, 0x1000efff, 0xefff1000
+ .long 0x3df3c20c, 0xffff0000, 0xffff0000, 0xffff0000
+ .long 0x7df3820c, 0x3df3c20c, 0xffff0000, 0x00000000
+ .long 0xffff0000, 0xffff0000, 0x3de3c21c, 0x3d83c27c
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0xffff0000, 0xffff0000, 0xffff0000, 0xffff0000
+ .long 0xffff0000, 0xffff0000, 0x0000ffff, 0xffff0000
+ .long 0xefff1000, 0xffff0000, 0xffff0000, 0xffff0000
+ .long 0xefff1000, 0xefff1000, 0xffff0000, 0x00000000
+ .long 0xffff0000, 0xffff0000, 0xefff1000, 0xefff1000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+#else
+ .long 0xffff0000, 0x2ffdd002, 0xffff0000, 0xffff0000
+ .long 0x2fffd000, 0xffff0000, 0x1000efff, 0xefff1000
+ .long 0x3ffbc004, 0xffff0000, 0xffff0000, 0xffff0000
+ .long 0x3ffbc004, 0x3ffbc004, 0xffff0000, 0x00000000
+ .long 0xffff0000, 0xffff0000, 0x3ffbc004, 0x3f9bc064
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0xffff0000, 0xffff0000, 0xffff0000, 0xffff0000
+ .long 0xffff0000, 0xffff0000, 0x0000ffff, 0xffff0000
+ .long 0xefff1000, 0xffff0000, 0xffff0000, 0xffff0000
+ .long 0xefff1000, 0xefff1000, 0xffff0000, 0x00000000
+ .long 0xffff0000, 0xffff0000, 0xefff1000, 0xffff0000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x00000000, 0x00000000, 0x00000000
+ .long 0x00000000, 0x50000000, 0x00000000, 0x00000000
+#endif
+gpio_dump_end:
+
.p2align
write_dumpreg:
return GRUB_ERR_NONE;
}
-/* Dump of GPIO connections. FIXME: Remove useless and macroify. */
-static grub_uint32_t gpiodump[] = {
- 0xffff0000, 0x2ffdd002, 0xffff0000, 0xffff0000,
- 0x2fffd000, 0xffff0000, 0x1000efff, 0xefff1000,
- 0x3ffbc004, 0xffff0000, 0xffff0000, 0xffff0000,
- 0x3ffbc004, 0x3ffbc004, 0xffff0000, 0x00000000,
- 0xffff0000, 0xffff0000, 0x3ffbc004, 0x3f9bc064,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0xffff0000, 0xffff0000, 0xffff0000, 0xffff0000,
- 0xffff0000, 0xffff0000, 0x0000ffff, 0xffff0000,
- 0xefff1000, 0xffff0000, 0xffff0000, 0xffff0000,
- 0xefff1000, 0xefff1000, 0xffff0000, 0x00000000,
- 0xffff0000, 0xffff0000, 0xefff1000, 0xffff0000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x50000000, 0x00000000, 0x00000000,
-};
-
static inline void
set_io_space (grub_pci_device_t dev, int num, grub_uint16_t start,
grub_uint16_t len)
void
grub_cs5536_init_geode (grub_pci_device_t dev)
{
- int i;
-
- /* Make sure GPIO is where we expect it to be. */
- grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_GPIO_BAR,
- GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_GPIO);
-
- /* Setup GPIO. */
- for (i = 0; i < (int) ARRAY_SIZE (gpiodump); i++)
- ((volatile grub_uint32_t *) (GRUB_MACHINE_PCI_IO_BASE
- + GRUB_CS5536_LBAR_GPIO)) [i] = gpiodump[i];
-
/* Enable more BARs. */
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IRQ_MAP_BAR,
GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_IRQ_MAP);