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

« back to all changes in this revision

Viewing changes to bus/cs5536.c

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

Show diffs side-by-side

added added

removed removed

Lines of Context:
213
213
  return GRUB_ERR_NONE;
214
214
}
215
215
 
 
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,
 
234
};
 
235
 
 
236
static inline void
 
237
set_io_space (grub_pci_device_t dev, int num, grub_uint16_t start,
 
238
              grub_uint16_t len)
 
239
{
 
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);
 
249
}
 
250
 
 
251
static inline void
 
252
set_iod (grub_pci_device_t dev, int num, int dest, int start, int mask)
 
253
{
 
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));
 
260
}
 
261
 
 
262
static inline void
 
263
set_p2d (grub_pci_device_t dev, int num, int dest, grub_uint32_t start)
 
264
{
 
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));
 
271
}
 
272
 
 
273
void
 
274
grub_cs5536_init_geode (grub_pci_device_t dev)
 
275
{
 
276
  int i;
 
277
 
 
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);
 
281
 
 
282
  /* Setup 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];
 
286
 
 
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);
 
296
 
 
297
  /* Setup DIVIL.  */
 
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);
 
309
 
 
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
 
315
                         | 0x05024000);
 
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)
 
320
                         | 0x05023000);
 
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);
 
330
 
 
331
  {
 
332
    volatile grub_uint32_t *oc;
 
333
    oc = grub_pci_device_map_range (dev, 0x05022000,
 
334
                                    GRUB_CS5536_USB_OPTION_REGS_SIZE);
 
335
 
 
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);
 
341
  }
 
342
 
 
343
  /* Setup IDE controller.  */
 
344
  grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_IDE_IO_BAR,
 
345
                         GRUB_CS5536_LBAR_IDE
 
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));
 
361
 
 
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);
 
369
 
 
370
  /* Setup windows.  */
 
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);
 
380
}