Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 1 | /* |
| 2 | * ACPI support |
| 3 | * written by Stefan Reinauer <stepan@openbios.org> |
| 4 | * (C) 2005 Stefan Reinauer |
| 5 | * |
| 6 | * |
| 7 | * Copyright 2005 AMD |
| 8 | * 2005.9 yhlu modify that to more dynamic for AMD Opteron Based MB |
| 9 | */ |
| 10 | |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 11 | #include <arch/acpi.h> |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 12 | #include <arch/smp/mpspec.h> |
| 13 | #include <device/pci.h> |
Jonathan A. Kollasch | 7a75aff | 2015-06-23 09:15:08 -0500 | [diff] [blame] | 14 | #include <assert.h> |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 15 | |
| 16 | /* APIC */ |
| 17 | unsigned long acpi_fill_madt(unsigned long current) |
| 18 | { |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 19 | device_t dev; |
Jonathan A. Kollasch | b679525 | 2013-10-11 14:58:39 -0500 | [diff] [blame] | 20 | struct resource *res; |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 21 | |
| 22 | /* create all subtables for processors */ |
| 23 | current = acpi_create_madt_lapics(current); |
| 24 | |
| 25 | /* Write NVIDIA CK804 IOAPIC. */ |
| 26 | dev = dev_find_slot(0x0, PCI_DEVFN(0x1,0)); |
Jonathan A. Kollasch | b679525 | 2013-10-11 14:58:39 -0500 | [diff] [blame] | 27 | ASSERT(dev != NULL); |
| 28 | |
| 29 | res = find_resource(dev, PCI_BASE_ADDRESS_1); |
| 30 | ASSERT(res != NULL); |
| 31 | |
| 32 | current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, |
| 33 | CONFIG_MAX_CPUS * CONFIG_MAX_PHYSICAL_CPUS, res->base, 0); |
| 34 | |
| 35 | /* Initialize interrupt mapping if mptable.c didn't. */ |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 36 | #if (!CONFIG_GENERATE_MP_TABLE) |
| 37 | #error untested config |
Jonathan A. Kollasch | b679525 | 2013-10-11 14:58:39 -0500 | [diff] [blame] | 38 | pci_write_config32(dev, 0x7c, 0x0120d218); |
| 39 | pci_write_config32(dev, 0x80, 0x12008a00); |
| 40 | pci_write_config32(dev, 0x84, 0x0000007d); |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 41 | #endif |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 42 | |
Jonathan A. Kollasch | ebbfbd5 | 2011-08-05 14:43:08 -0500 | [diff] [blame] | 43 | /* IRQ9 */ |
| 44 | current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *) |
| 45 | current, 0, 9, 9, MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_LOW); |
| 46 | |
| 47 | /* create all subtables for processors */ |
| 48 | /* acpi_create_madt_lapic_nmis returns current, not size. */ |
| 49 | current = acpi_create_madt_lapic_nmis(current, |
| 50 | MP_IRQ_TRIGGER_EDGE | MP_IRQ_POLARITY_HIGH, 1); |
| 51 | |
| 52 | return current; |
| 53 | } |