1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <types.h>
21#include <lib.h>
22#include <console.h>
23#include <device/pci.h>
24#include <msr.h>
25#include <amd_geodelx.h>
26#include <legacy.h>
27#include <device/pci_ids.h>
28#include <statictree.h>
29#include "cs5536.h"
30
31
32static const struct msrinit SB_MASTER_CONF_TABLE[] = {
33 {USB2_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00008f000}},
34 {ATA_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00048f000}},
35 {AC97_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00008f000}},
36 {MDD_SB_GLD_MSR_CONF, {.hi = 0,.lo = 0x00000f000}},
37 {0, {0, 0}}
38};
39
40
41static const struct msrinit CS5536_CLOCK_GATING_TABLE[] = {
42 {GLIU_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000004}},
43 {GLPCI_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000005}},
44 {GLCP_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000004}},
45 {MDD_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x050554111}},
46 {ATA_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000005}},
47 {AC97_SB_GLD_MSR_PM, {.hi = 0,.lo = 0x000000005}},
48 {0, {0, 0}}
49};
50
51struct acpi_init {
52 u16 ioreg;
53 u32 regdata;
54};
55
56static const struct acpi_init acpi_init_table[] = {
57 {ACPI_IO_BASE + 0x00, 0x01000000},
58 {ACPI_IO_BASE + 0x08, 0x00000000},
59 {ACPI_IO_BASE + 0x0C, 0x00000000},
60 {ACPI_IO_BASE + 0x1C, 0x00000000},
61 {ACPI_IO_BASE + 0x18, 0xFFFFFFFF},
62 {ACPI_IO_BASE + 0x00, 0x0000FFFF},
63 {PMS_IO_BASE + PM_SCLK, 0x00000E00},
64 {PMS_IO_BASE + PM_SED, 0x00004601},
65 {PMS_IO_BASE + PM_SIDD, 0x00008C02},
66 {PMS_IO_BASE + PM_WKD, 0x000000A0},
67 {PMS_IO_BASE + PM_WKXD, 0x000000A0},
68 {0, 0}
69};
70
71static const u32 FlashPort[] = {
72 MDD_LBAR_FLSH0,
73 MDD_LBAR_FLSH1,
74 MDD_LBAR_FLSH2,
75 MDD_LBAR_FLSH3
76};
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91void hide_vpci(u32 vpci_devid)
92{
93 printk(BIOS_DEBUG, "Hiding VPCI device: 0x%08X (%02x:%02x.%01x)\n",
94 vpci_devid, (vpci_devid >> 16) & 0xff,
95 (vpci_devid >> 11) & 0x1f, (vpci_devid >> 8) & 0x7);
96 outl(vpci_devid + 0x7C, 0xCF8);
97 outl(0xDEADBEEF, 0xCFC);
98}
99
100
101
102
103
104
105
106
107
108
109
110static void cs5536_setup_power_button(struct southbridge_amd_cs5536_dts_config *sb )
111{
112 if (!sb->power_button)
113 return;
114
115 outl(0x40020000, PMS_IO_BASE + 0x40);
116 outl(GPIOH_24_SET, GPIO_IO_BASE + GPIOH_OUT_AUX1_SELECT);
117 outl(GPIOH_24_SET, GPIO_IO_BASE + GPIOH_OUTPUT_ENABLE);
118}
119
120
121
122
123static void pm_chipset_init(void)
124{
125 outl(0x0E00, PMS_IO_BASE + 0x010);
126
127
128 outl(0x00A0, PMS_IO_BASE + PM_WKXD);
129
130 outl(0x00A0, PMS_IO_BASE + PM_WKD);
131
132
133 outl(0x4601, PMS_IO_BASE + PM_SED);
134
135
136 outl(0x8C02, PMS_IO_BASE + PM_SIDD);
137}
138
139
140
141
142
143
144static void chipset_flash_setup(struct southbridge_amd_cs5536_dts_config *sb)
145{
146 int i;
147 struct msr msr;
148
149 printk(BIOS_DEBUG, "chipset_flash_setup: Start\n");
150 if (sb->enable_ide_nand_flash <= 4) {
151 i = sb->enable_ide_nand_flash - 1;
152 printk(BIOS_DEBUG, "Enable CS%d\n", i);
153
154 msr = rdmsr(FlashPort[i]);
155 msr.hi = 0;
156 msr.hi |= 0x00000002;
157 msr.hi |= 0x00000004;
158 msr.hi |= FLASH_MEM_4K;
159 printk(BIOS_DEBUG, "MSR(0x%08X, %08X_%08X)\n",
160 FlashPort[i], msr.hi, msr.lo);
161 wrmsr(FlashPort[i], msr);
162
163
164 msr = rdmsr(MDD_NORF_CNTRL);
165 msr.lo |= (1 << i);
166 printk(BIOS_DEBUG, "MSR(0x%08X, %08X_%08X)\n",
167 MDD_NORF_CNTRL, msr.hi, msr.lo);
168 wrmsr(MDD_NORF_CNTRL, msr);
169 }
170 printk(BIOS_DEBUG, "chipset_flash_setup: Finish\n");
171}
172
173#define RTC_CENTURY 0x32
174#define RTC_DOMA 0x3D
175#define RTC_MONA 0x3E
176
177
178
179
180
181
182
183
184
185
186static void lpc_init(struct southbridge_amd_cs5536_dts_config *sb)
187{
188 struct msr msr;
189
190 if (sb->lpc_serirq_enable) {
191 msr.lo = sb->lpc_serirq_enable;
192 msr.hi = 0;
193 wrmsr(MDD_IRQM_LPC, msr);
194 if (sb->lpc_serirq_polarity) {
195 msr.lo = sb->lpc_serirq_polarity << 16;
196 msr.lo |= (sb->lpc_serirq_mode << 6) | (1 << 7);
197 msr.hi = 0;
198 wrmsr(MDD_LPC_SIRQ, msr);
199 }
200 }
201
202
203 msr = rdmsr(MDD_DMA_MAP);
204 msr.lo = 0x7777;
205 wrmsr(MDD_DMA_MAP, msr);
206
207
208 msr = rdmsr(MDD_RTC_CENTURY_OFFSET);
209 msr.lo = RTC_CENTURY;
210 wrmsr(MDD_RTC_CENTURY_OFFSET, msr);
211
212
213 msr = rdmsr(MDD_RTC_DOMA_IND);
214 msr.lo = RTC_DOMA;
215 wrmsr(MDD_RTC_DOMA_IND, msr);
216
217 msr = rdmsr(MDD_RTC_MONA_IND);
218 msr.lo = RTC_MONA;
219 wrmsr(MDD_RTC_MONA_IND, msr);
220
221 rtc_init(0);
222
223 isa_dma_init();
224}
225
226
227
228
229
230
231
232
233
234static void uarts_init(struct southbridge_amd_cs5536_dts_config *sb,
235 struct device *dev)
236{
237 struct msr msr;
238 u16 addr = 0;
239 u32 gpio_addr;
240
241 gpio_addr = pci_read_config32(dev, PCI_BASE_ADDRESS_1);
242 gpio_addr &= ~1;
243 printk(BIOS_DEBUG, "GPIO_ADDR: %08X\n", gpio_addr);
244
245
246
247
248 if (sb->com1_enable) {
249 printk(BIOS_SPEW, "uarts_init: enable COM1\n");
250
251 switch (sb->com1_address) {
252 case 0x3F8:
253 addr = 7;
254 break;
255 case 0x3E8:
256 addr = 6;
257 break;
258 case 0x2F8:
259 addr = 5;
260 break;
261 case 0x2E8:
262 addr = 4;
263 break;
264 }
265 msr = rdmsr(MDD_LEG_IO);
266 msr.lo |= addr << 16;
267 wrmsr(MDD_LEG_IO, msr);
268
269
270 msr = rdmsr(MDD_IRQM_YHIGH);
271 msr.lo |= sb->com1_irq << 24;
272 wrmsr(MDD_IRQM_YHIGH, msr);
273
274
275
276 outl(GPIOL_8_SET, gpio_addr + GPIOL_OUTPUT_ENABLE);
277
278 outl(GPIOL_8_SET, gpio_addr + GPIOL_OUT_AUX1_SELECT);
279
280
281
282 outl(GPIOL_9_SET, gpio_addr + GPIOL_INPUT_ENABLE);
283
284 outl(GPIOL_9_SET, gpio_addr + GPIOL_IN_AUX1_SELECT);
285
286
287 outl(GPIOL_8_SET | GPIOL_9_SET,
288 gpio_addr + GPIOL_PULLUP_ENABLE);
289
290
291
292
293
294
295 msr.lo = (1 << 4) | (1 << 1);
296 msr.hi = 0;
297 wrmsr(MDD_UART1_CONF, msr);
298 } else {
299
300 printk(BIOS_SPEW, "uarts_init: disable COM1\n");
301 msr = rdmsr(MDD_UART1_CONF);
302 msr.lo = 1;
303 wrmsr(MDD_UART1_CONF, msr);
304 msr.lo = 0;
305 wrmsr(MDD_UART1_CONF, msr);
306
307
308 msr = rdmsr(MDD_LEG_IO);
309 msr.lo &= ~(0xF << 16);
310 wrmsr(MDD_LEG_IO, msr);
311 }
312
313
314 if (sb->com2_enable) {
315 printk(BIOS_SPEW, "uarts_init: enable COM2\n");
316 switch (sb->com2_address) {
317 case 0x3F8:
318 addr = 7;
319 break;
320 case 0x3E8:
321 addr = 6;
322 break;
323 case 0x2F8:
324 addr = 5;
325 break;
326 case 0x2E8:
327 addr = 4;
328 break;
329 }
330 msr = rdmsr(MDD_LEG_IO);
331 msr.lo |= addr << 20;
332 wrmsr(MDD_LEG_IO, msr);
333 printk(BIOS_SPEW, "uarts_init: wrote COM2 address 0x%x\n", sb->com2_address);
334
335
336 msr = rdmsr(MDD_IRQM_YHIGH);
337 msr.lo |= sb->com2_irq << 28;
338 wrmsr(MDD_IRQM_YHIGH, msr);
339 printk(BIOS_SPEW, "uarts_init: set COM2 irq\n");
340
341
342
343 outl(GPIOL_3_SET, gpio_addr + GPIOL_OUTPUT_ENABLE);
344 printk(BIOS_SPEW, "uarts_init: set output enable\n");
345
346 outl(GPIOL_3_SET, gpio_addr + GPIOL_OUT_AUX1_SELECT);
347 printk(BIOS_SPEW, "uarts_init: set OUTAUX1\n");
348
349
350
351 outl(GPIOL_4_SET, gpio_addr + GPIOL_INPUT_ENABLE);
352 printk(BIOS_SPEW, "uarts_init: set COM2 input enable\n");
353
354
355
356
357
358
359
360
361 outl(GPIOL_3_SET | GPIOL_4_SET,
362 gpio_addr + GPIOL_PULLUP_ENABLE);
363 printk(BIOS_SPEW, "uarts_init: set pullup COM2\n");
364
365
366
367
368
369
370 msr.lo = (1 << 4) | (1 << 1);
371 msr.hi = 0;
372 wrmsr(MDD_UART2_CONF, msr);
373 printk(BIOS_SPEW, "uarts_init: COM2 enabled\n");
374 } else {
375 printk(BIOS_SPEW, "uarts_init: disable COM2\n");
376
377 msr = rdmsr(MDD_UART2_CONF);
378 msr.lo = 1;
379 wrmsr(MDD_UART2_CONF, msr);
380 msr.lo = 0;
381 wrmsr(MDD_UART2_CONF, msr);
382
383
384 msr = rdmsr(MDD_LEG_IO);
385 msr.lo &= ~(0xF << 20);
386 wrmsr(MDD_LEG_IO, msr);
387 }
388}
389
390#define HCCPARAMS 0x08
391#define IPREG04 0xA0
392#define USB_HCCPW_SET (1 << 1)
393#define UOCCAP 0x00
394#define APU_SET (1 << 15)
395#define UOCMUX 0x04
396#define PMUX_HOST 0x02
397#define PMUX_DEVICE 0x03
398#define PUEN_SET (1 << 2)
399#define UDCDEVCTL 0x404
400#define UDC_SD_SET (1 << 10)
401#define UOCCTL 0x0C
402#define PADEN_SET (1 << 7)
403
404
405
406
407
408
409static void enable_USB_port4(struct southbridge_amd_cs5536_dts_config *sb)
410{
411 u8 *bar;
412 struct msr msr;
413 struct device *ehci_dev, *otg_dev, *udc_dev;
414
415 ehci_dev = dev_find_pci_device(PCI_VENDOR_ID_AMD,
416 PCI_DEVICE_ID_AMD_CS5536_EHCI, 0);
417 if (ehci_dev) {
418
419 msr = rdmsr(USB2_SB_GLD_MSR_CONF);
420 msr.hi |= USB2_UPPER_SSDEN_SET;
421 wrmsr(USB2_SB_GLD_MSR_CONF, msr);
422
423
424 wrmsr(USB2_SB_GLD_MSR_DIAG, rdmsr(USB2_SB_GLD_MSR_DIAG));
425
426 bar = (u8 *) pci_read_config32(ehci_dev, PCI_BASE_ADDRESS_0);
427
428
429 writel(readl(bar + IPREG04) | USB_HCCPW_SET, bar + IPREG04);
430
431
432 writel(0x00005012, bar + HCCPARAMS);
433 }
434
435 otg_dev = dev_find_pci_device(PCI_VENDOR_ID_AMD,
436 PCI_DEVICE_ID_AMD_CS5536_OTG, 0);
437 if (otg_dev) {
438 bar = (u8 *) pci_read_config32(otg_dev, PCI_BASE_ADDRESS_0);
439
440 printk(BIOS_DEBUG, "UOCMUX is %x\n", readl(bar + UOCMUX));
441
442 writel(readl(bar + UOCMUX) & PUEN_SET, bar + UOCMUX);
443
444
445 if (sb->enable_USBP4_device)
446 writel(readl(bar + UOCMUX) | PMUX_DEVICE, bar + UOCMUX);
447 else
448 writel(readl(bar + UOCMUX) | PMUX_HOST, bar + UOCMUX);
449
450
451 printk(BIOS_DEBUG, "UOCCAP is %x\n", readl(bar + UOCCAP));
452 if (sb->enable_USBP4_overcurrent)
453 writel(readl(bar + UOCCAP)
454 | sb->enable_USBP4_overcurrent, bar + UOCCAP);
455
456 if (sb->pph) {
457 writel((readl(bar + UOCCAP)
458 & ~0xff) | sb->pph, bar + UOCCAP);
459 }
460 printk(BIOS_DEBUG, "UOCCAP is %x\n", readl(bar + UOCCAP));
461 printk(BIOS_DEBUG, "UOCMUX is %x\n", readl(bar + UOCMUX));
462
463 }
464
465 udc_dev = dev_find_pci_device(PCI_VENDOR_ID_AMD,
466 PCI_DEVICE_ID_AMD_CS5536_UDC, 0);
467
468
469
470
471
472
473 if (sb->enable_USBP4_device) {
474 if (udc_dev) {
475 bar = (u8 *)pci_read_config32(udc_dev, PCI_BASE_ADDRESS_0);
476 writel(readl(bar + UDCDEVCTL) | UDC_SD_SET,
477 bar + UDCDEVCTL);
478 }
479
480 if (otg_dev) {
481 bar = (u8 *)pci_read_config32(otg_dev, PCI_BASE_ADDRESS_0);
482 writel(readl(bar + UOCCTL) | PADEN_SET, bar + UOCCTL);
483 writel(readl(bar + UOCCAP) | APU_SET, bar + UOCCAP);
484 printk(BIOS_DEBUG, "UOCCTL is %x\n", readl(bar + UOCCTL));
485 }
486 }
487
488
489
490
491
492
493
494
495
496
497
498
499 if (udc_dev)
500 pci_write_config32(udc_dev, 0x7C, 0xDEADBEEF);
501
502 if (otg_dev)
503 pci_write_config32(otg_dev, 0x7C, 0xDEADBEEF);
504}
505
506
507
508
509
510
511
512
513
514
515void chipsetinit(void)
516{
517 struct device *dev;
518 struct msr msr;
519 struct southbridge_amd_cs5536_dts_config *sb;
520 const struct msrinit *csi;
521
522 post_code(P80_CHIPSET_INIT);
523 dev = dev_find_pci_device(PCI_VENDOR_ID_AMD,
524 PCI_DEVICE_ID_AMD_CS5536_ISA, 0);
525 if (!dev) {
526 printk(BIOS_ERR, "%s: Could not find the south bridge!\n",
527 __func__);
528 return;
529 }
530 sb = (struct southbridge_amd_cs5536_dts_config *)dev->device_configuration;
531
532#ifdef CONFIG_SUSPEND_TO_RAM
533 if (!IsS3Resume())
534#endif
535 {
536 const struct acpi_init *aci = acpi_init_table;
537 for (; aci->ioreg; aci++) {
538 outl(aci->regdata, aci->ioreg);
539 inl(aci->ioreg);
540 }
541 pm_chipset_init();
542 }
543
544
545 outl(GPIOL_2_SET, GPIO_IO_BASE + GPIOL_INPUT_ENABLE);
546 outl(GPIOL_2_SET, GPIO_IO_BASE + GPIOL_IN_AUX1_SELECT);
547
548
549
550
551 msr = rdmsr(ATA_SB_GLD_MSR_ERR);
552 msr.lo &= ~0x100;
553 wrmsr(ATA_SB_GLD_MSR_ERR, msr);
554
555
556 msr = rdmsr(GLPCI_SB_CTRL);
557 msr.lo |= GLPCI_CRTL_PPIDE_SET;
558 wrmsr(GLPCI_SB_CTRL, msr);
559
560 csi = SB_MASTER_CONF_TABLE;
561 for (; csi->msrnum; csi++) {
562 msr.lo = csi->msr.lo;
563 msr.hi = csi->msr.hi;
564 wrmsr(csi->msrnum, msr);
565 }
566
567
568 printk(BIOS_ERR, "%sDoing chipset_flash_setup()\n",
569 sb->enable_ide_nand_flash != 0 ? "" : "Not ");
570 if (sb->enable_ide_nand_flash != 0)
571 chipset_flash_setup(sb);
572
573
574
575 {
576 csi = CS5536_CLOCK_GATING_TABLE;
577 for (; csi->msrnum; csi++) {
578 msr.lo = csi->msr.lo;
579 msr.hi = csi->msr.hi;
580 wrmsr(csi->msrnum, msr);
581 }
582 }
583}
584
585#define IDE_CFG 0x40
586 #define CHANEN (1L << 1)
587 #define PWB (1L << 14)
588 #define CABLE (1L << 16)
589#define IDE_DTC 0x48
590#define IDE_CAST 0x4C
591#define IDE_ETC 0x50
592
593
594
595
596
597
598
599static void ide_init(struct device *dev)
600{
601 u32 ide_cfg;
602
603 printk(BIOS_DEBUG, "cs5536_ide: %s\n", __func__);
604
605
606
607
608 ide_cfg = pci_read_config32(dev, IDE_CFG);
609 ide_cfg |= CHANEN | PWB;
610 pci_write_config32(dev, IDE_CFG, ide_cfg);
611}
612
613
614
615
616
617
618static void southbridge_init(struct device *dev)
619{
620 int i;
621 struct southbridge_amd_cs5536_dts_config *sb =
622 (struct southbridge_amd_cs5536_dts_config *)dev->device_configuration;
623
624
625
626
627
628
629 printk(BIOS_ERR, "cs5536: %s\n", __func__);
630
631 setup_i8259();
632 lpc_init(sb);
633 uarts_init(sb, dev);
634
635 printk(BIOS_SPEW, "cs5536: done uarts_init\n");
636 if (sb->enable_gpio_int_route) {
637 printk(BIOS_SPEW, "cs5536: call vr_write\n");
638 vr_write((VRC_MISCELLANEOUS << 8) + PCI_INT_AB,
639 (sb->enable_gpio_int_route & 0xFFFF));
640 printk(BIOS_SPEW, "cs5536: done first call vr_write\n");
641 vr_write((VRC_MISCELLANEOUS << 8) + PCI_INT_CD,
642 (sb->enable_gpio_int_route >> 16));
643 printk(BIOS_SPEW, "cs5536: done second call vr_write\n");
644 }
645
646 enable_USB_port4(sb);
647
648
649 for (i = 0; 0 != sb->unwanted_vpci[i]; i++) {
650 hide_vpci(sb->unwanted_vpci[i]);
651 }
652
653 cs5536_setup_power_button(sb);
654
655 printk(BIOS_SPEW, "cs5536: %s() Exit\n", __func__);
656}
657
658
659
660
661
662
663static void cs5536_read_resources(struct device *dev)
664{
665
666
667 struct resource *res;
668 res = new_resource(dev, 0);
669 res->base = 0x0UL;
670 res->size = 0x1000UL;
671 res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED |
672 IORESOURCE_STORED;
673
674 pci_dev_read_resources(dev);
675}
676
677
678
679
680
681
682
683static void cs5536_pci_dev_enable_resources(struct device *dev)
684{
685 printk(BIOS_SPEW, "cs5536: %s()\n", __func__);
686 pci_dev_enable_resources(dev);
687 enable_childrens_resources(dev);
688 printk(BIOS_SPEW, "cs5536: %s() Exit\n", __func__);
689}
690
691struct device_operations cs5536_ops = {
692 .id = {.type = DEVICE_ID_PCI,
693 {.pci = {.vendor = PCI_VENDOR_ID_AMD,
694 .device = PCI_DEVICE_ID_AMD_CS5536_ISA}}},
695 .constructor = default_device_constructor,
696 .phase3_scan = scan_static_bus,
697 .phase4_read_resources = cs5536_read_resources,
698 .phase4_set_resources = pci_set_resources,
699 .phase5_enable_resources = cs5536_pci_dev_enable_resources,
700 .phase6_init = southbridge_init,
701};
702
703struct device_operations cs5536_ide = {
704 .id = {.type = DEVICE_ID_PCI,
705 {.pci = {.vendor = PCI_VENDOR_ID_AMD,
706 .device = PCI_DEVICE_ID_AMD_CS5536_B0_IDE}}},
707 .constructor = default_device_constructor,
708 .phase3_scan = 0,
709 .phase4_read_resources = pci_dev_read_resources,
710 .phase4_set_resources = pci_set_resources,
711 .phase5_enable_resources = pci_dev_enable_resources,
712 .phase6_init = ide_init,
713 .ops_pci = &pci_dev_ops_pci,
714};
715