213
213
return GRUB_ERR_NONE;
216
/* Dump of GPIO connections. FIXME: Remove useless and macroify. */
217
static grub_uint32_t gpiodump[] = {
218
0xffff0000, 0x2ffdd002, 0xffff0000, 0xffff0000,
219
0x2fffd000, 0xffff0000, 0x1000efff, 0xefff1000,
220
0x3ffbc004, 0xffff0000, 0xffff0000, 0xffff0000,
221
0x3ffbc004, 0x3ffbc004, 0xffff0000, 0x00000000,
222
0xffff0000, 0xffff0000, 0x3ffbc004, 0x3f9bc064,
223
0x00000000, 0x00000000, 0x00000000, 0x00000000,
224
0x00000000, 0x00000000, 0x00000000, 0x00000000,
225
0x00000000, 0x00000000, 0x00000000, 0x00000000,
226
0xffff0000, 0xffff0000, 0xffff0000, 0xffff0000,
227
0xffff0000, 0xffff0000, 0x0000ffff, 0xffff0000,
228
0xefff1000, 0xffff0000, 0xffff0000, 0xffff0000,
229
0xefff1000, 0xefff1000, 0xffff0000, 0x00000000,
230
0xffff0000, 0xffff0000, 0xefff1000, 0xffff0000,
231
0x00000000, 0x00000000, 0x00000000, 0x00000000,
232
0x00000000, 0x00000000, 0x00000000, 0x00000000,
233
0x00000000, 0x50000000, 0x00000000, 0x00000000,
237
set_io_space (grub_pci_device_t dev, int num, grub_uint16_t start,
240
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_GL_REGIONS_START + num,
241
((((grub_uint64_t) start + len - 4)
242
<< GRUB_CS5536_MSR_GL_REGION_IO_TOP_SHIFT)
243
& GRUB_CS5536_MSR_GL_REGION_TOP_MASK)
244
| (((grub_uint64_t) start
245
<< GRUB_CS5536_MSR_GL_REGION_IO_BASE_SHIFT)
246
& GRUB_CS5536_MSR_GL_REGION_BASE_MASK)
247
| GRUB_CS5536_MSR_GL_REGION_IO
248
| GRUB_CS5536_MSR_GL_REGION_ENABLE);
252
set_iod (grub_pci_device_t dev, int num, int dest, int start, int mask)
254
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_GL_IOD_START + num,
255
((grub_uint64_t) dest << GRUB_CS5536_IOD_DEST_SHIFT)
256
| (((grub_uint64_t) start & GRUB_CS5536_IOD_ADDR_MASK)
257
<< GRUB_CS5536_IOD_BASE_SHIFT)
258
| ((mask & GRUB_CS5536_IOD_ADDR_MASK)
259
<< GRUB_CS5536_IOD_MASK_SHIFT));
263
set_p2d (grub_pci_device_t dev, int num, int dest, grub_uint32_t start)
265
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_GL_P2D_START + num,
266
(((grub_uint64_t) dest) << GRUB_CS5536_P2D_DEST_SHIFT)
267
| ((grub_uint64_t) (start >> GRUB_CS5536_P2D_LOG_ALIGN)
268
<< GRUB_CS5536_P2D_BASE_SHIFT)
269
| (((1 << (32 - GRUB_CS5536_P2D_LOG_ALIGN)) - 1)
270
<< GRUB_CS5536_P2D_MASK_SHIFT));
274
grub_cs5536_init_geode (grub_pci_device_t dev)
278
/* Make sure GPIO is where we expect it to be. */
279
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_GPIO_BAR,
280
GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_GPIO);
283
for (i = 0; i < (int) ARRAY_SIZE (gpiodump); i++)
284
((volatile grub_uint32_t *) (GRUB_MACHINE_PCI_IO_BASE
285
+ GRUB_CS5536_LBAR_GPIO)) [i] = gpiodump[i];
287
/* Enable more BARs. */
288
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IRQ_MAP_BAR,
289
GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_IRQ_MAP);
290
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_MFGPT_BAR,
291
GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_MFGPT);
292
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_ACPI_BAR,
293
GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_ACPI);
294
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_PM_BAR,
295
GRUB_CS5536_LBAR_TURN_ON | GRUB_CS5536_LBAR_PM);
298
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_DIVIL_LEG_IO,
299
GRUB_CS5536_MSR_DIVIL_LEG_IO_MODE_X86
300
| GRUB_CS5536_MSR_DIVIL_LEG_IO_F_REMAP
301
| GRUB_CS5536_MSR_DIVIL_LEG_IO_RTC_ENABLE0
302
| GRUB_CS5536_MSR_DIVIL_LEG_IO_RTC_ENABLE1);
303
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_DIVIL_IRQ_MAPPER_PRIMARY_MASK,
304
(~GRUB_CS5536_DIVIL_LPC_INTERRUPTS) & 0xffff);
305
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_DIVIL_IRQ_MAPPER_LPC_MASK,
306
GRUB_CS5536_DIVIL_LPC_INTERRUPTS);
307
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_DIVIL_LPC_SERIAL_IRQ_CONTROL,
308
GRUB_CS5536_MSR_DIVIL_LPC_SERIAL_IRQ_CONTROL_ENABLE);
310
/* Initialise USB controller. */
311
/* FIXME: assign adresses dynamically. */
312
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_OHCI_BASE,
313
GRUB_CS5536_MSR_USB_BASE_BUS_MASTER
314
| GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE
316
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE,
317
GRUB_CS5536_MSR_USB_BASE_BUS_MASTER
318
| GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE
319
| (0x20ULL << GRUB_CS5536_MSR_USB_EHCI_BASE_FLDJ_SHIFT)
321
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_CONTROLLER_BASE,
322
GRUB_CS5536_MSR_USB_BASE_BUS_MASTER
323
| GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE | 0x05020000);
324
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_OPTION_CONTROLLER_BASE,
325
GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE | 0x05022000);
326
set_p2d (dev, 0, GRUB_CS5536_DESTINATION_USB, 0x05020000);
327
set_p2d (dev, 1, GRUB_CS5536_DESTINATION_USB, 0x05022000);
328
set_p2d (dev, 5, GRUB_CS5536_DESTINATION_USB, 0x05024000);
329
set_p2d (dev, 6, GRUB_CS5536_DESTINATION_USB, 0x05023000);
332
volatile grub_uint32_t *oc;
333
oc = grub_pci_device_map_range (dev, 0x05022000,
334
GRUB_CS5536_USB_OPTION_REGS_SIZE);
336
oc[GRUB_CS5536_USB_OPTION_REG_UOCMUX] =
337
(oc[GRUB_CS5536_USB_OPTION_REG_UOCMUX]
338
& ~GRUB_CS5536_USB_OPTION_REG_UOCMUX_PMUX_MASK)
339
| GRUB_CS5536_USB_OPTION_REG_UOCMUX_PMUX_HC;
340
grub_pci_device_unmap_range (dev, oc, GRUB_CS5536_USB_OPTION_REGS_SIZE);
343
/* Setup IDE controller. */
344
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IDE_IO_BAR,
346
| GRUB_CS5536_MSR_IDE_IO_BAR_UNITS);
347
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IDE_CFG,
348
GRUB_CS5536_MSR_IDE_CFG_CHANNEL_ENABLE);
349
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IDE_TIMING,
350
(GRUB_CS5536_MSR_IDE_TIMING_PIO0
351
<< GRUB_CS5536_MSR_IDE_TIMING_DRIVE0_SHIFT)
352
| (GRUB_CS5536_MSR_IDE_TIMING_PIO0
353
<< GRUB_CS5536_MSR_IDE_TIMING_DRIVE1_SHIFT));
354
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IDE_CAS_TIMING,
355
(GRUB_CS5536_MSR_IDE_CAS_TIMING_CMD_PIO0
356
<< GRUB_CS5536_MSR_IDE_CAS_TIMING_CMD_SHIFT)
357
| (GRUB_CS5536_MSR_IDE_CAS_TIMING_PIO0
358
<< GRUB_CS5536_MSR_IDE_CAS_TIMING_DRIVE0_SHIFT)
359
| (GRUB_CS5536_MSR_IDE_CAS_TIMING_PIO0
360
<< GRUB_CS5536_MSR_IDE_CAS_TIMING_DRIVE1_SHIFT));
362
/* Setup Geodelink PCI. */
363
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_GL_PCI_CTRL,
364
(4ULL << GRUB_CS5536_MSR_GL_PCI_CTRL_OUT_THR_SHIFT)
365
| (4ULL << GRUB_CS5536_MSR_GL_PCI_CTRL_IN_THR_SHIFT)
366
| (8ULL << GRUB_CS5536_MSR_GL_PCI_CTRL_LATENCY_SHIFT)
367
| GRUB_CS5536_MSR_GL_PCI_CTRL_IO_ENABLE
368
| GRUB_CS5536_MSR_GL_PCI_CTRL_MEMORY_ENABLE);
371
set_io_space (dev, 0, GRUB_CS5536_LBAR_SMBUS, GRUB_CS5536_SMBUS_REGS_SIZE);
372
set_io_space (dev, 1, GRUB_CS5536_LBAR_GPIO, GRUB_CS5536_GPIO_REGS_SIZE);
373
set_io_space (dev, 2, GRUB_CS5536_LBAR_MFGPT, GRUB_CS5536_MFGPT_REGS_SIZE);
374
set_io_space (dev, 3, GRUB_CS5536_LBAR_IRQ_MAP, GRUB_CS5536_IRQ_MAP_REGS_SIZE);
375
set_io_space (dev, 4, GRUB_CS5536_LBAR_PM, GRUB_CS5536_PM_REGS_SIZE);
376
set_io_space (dev, 5, GRUB_CS5536_LBAR_ACPI, GRUB_CS5536_ACPI_REGS_SIZE);
377
set_iod (dev, 0, GRUB_CS5536_DESTINATION_IDE, GRUB_ATA_CH0_PORT1, 0xffff8);
378
set_iod (dev, 1, GRUB_CS5536_DESTINATION_ACC, GRUB_CS5536_LBAR_ACC, 0xfff80);
379
set_iod (dev, 2, GRUB_CS5536_DESTINATION_IDE, GRUB_CS5536_LBAR_IDE, 0xffff0);