You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (140 commits) ACPICA: reduce table header messages to fit within 80 columns asus-laptop: merge with ACPICA table update ACPI: bay: Convert ACPI Bay driver to be compatible with sysfs update. ACPI: bay: new driver is EXPERIMENTAL ACPI: bay: make drive_bays static ACPI: bay: make bay a platform driver ACPI: bay: remove prototype procfs code ACPI: bay: delete unused variable ACPI: bay: new driver adding removable drive bay support ACPI: dock: check if parent is on dock ACPICA: fix gcc build warnings Altix: Add ACPI SSDT PCI device support (hotplug) Altix: ACPI SSDT PCI device support ACPICA: reduce conflicts with Altix patch series ACPI_NUMA: fix HP IA64 simulator issue with extended memory domain ACPI: fix HP RX2600 IA64 boot ACPI: build fix for IBM x440 - CONFIG_X86_SUMMIT ACPICA: Update version to 20070126 ACPICA: Fix for incorrect parameter passed to AcpiTbDeleteTable during table load. ACPICA: Update copyright to 2007. ...
This commit is contained in:
@@ -274,6 +274,7 @@ Who: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
<<<<<<< test:Documentation/feature-removal-schedule.txt
|
||||
What: ACPI hotkey driver (CONFIG_ACPI_HOTKEY)
|
||||
When: 2.6.21
|
||||
Why: hotkey.c was an attempt to consolidate multiple drivers that use
|
||||
@@ -306,11 +307,18 @@ Why: The ACPI namespace is effectively the symbol list for
|
||||
the BIOS can be extracted and disassembled with acpidump
|
||||
and iasl as documented in the pmtools package here:
|
||||
http://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils
|
||||
|
||||
Who: Len Brown <len.brown@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: ACPI procfs interface
|
||||
When: July 2007
|
||||
Why: After ACPI sysfs conversion, ACPI attributes will be duplicated
|
||||
in sysfs and the ACPI procfs interface should be removed.
|
||||
Who: Zhang Rui <rui.zhang@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /proc/acpi/button
|
||||
When: August 2007
|
||||
Why: /proc/acpi/button has been replaced by events to the input layer
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
|
||||
Video Output Switcher Control
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
2006 luming.yu@intel.com
|
||||
|
||||
The output sysfs class driver provides an abstract video output layer that
|
||||
can be used to hook platform specific methods to enable/disable video output
|
||||
device through common sysfs interface. For example, on my IBM ThinkPad T42
|
||||
laptop, The ACPI video driver registered its output devices and read/write
|
||||
method for 'state' with output sysfs class. The user interface under sysfs is:
|
||||
|
||||
linux:/sys/class/video_output # tree .
|
||||
.
|
||||
|-- CRT0
|
||||
| |-- device -> ../../../devices/pci0000:00/0000:00:01.0
|
||||
| |-- state
|
||||
| |-- subsystem -> ../../../class/video_output
|
||||
| `-- uevent
|
||||
|-- DVI0
|
||||
| |-- device -> ../../../devices/pci0000:00/0000:00:01.0
|
||||
| |-- state
|
||||
| |-- subsystem -> ../../../class/video_output
|
||||
| `-- uevent
|
||||
|-- LCD0
|
||||
| |-- device -> ../../../devices/pci0000:00/0000:00:01.0
|
||||
| |-- state
|
||||
| |-- subsystem -> ../../../class/video_output
|
||||
| `-- uevent
|
||||
`-- TV0
|
||||
|-- device -> ../../../devices/pci0000:00/0000:00:01.0
|
||||
|-- state
|
||||
|-- subsystem -> ../../../class/video_output
|
||||
`-- uevent
|
||||
|
||||
@@ -584,6 +584,14 @@ W: http://sourceforge.net/projects/acpi4asus
|
||||
W: http://xf.iksaif.net/acpi4asus
|
||||
S: Maintained
|
||||
|
||||
ASUS LAPTOP EXTRAS DRIVER
|
||||
P: Corentin Chary
|
||||
M: corentincj@iksaif.net
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
W: http://sourceforge.net/projects/acpi4asus
|
||||
W: http://xf.iksaif.net/acpi4asus
|
||||
S: Maintained
|
||||
|
||||
ATA OVER ETHERNET DRIVER
|
||||
P: Ed L. Cashin
|
||||
M: ecashin@coraid.com
|
||||
|
||||
+2
-1
@@ -466,7 +466,8 @@ CONFIG_FW_LOADER=y
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
# CONFIG_PNP is not set
|
||||
CONFIG_PNP=y
|
||||
CONFIG_PNPACPI=y
|
||||
|
||||
#
|
||||
# Block devices
|
||||
|
||||
+99
-136
File diff suppressed because it is too large
Load Diff
@@ -16,7 +16,7 @@
|
||||
|
||||
static int nvidia_hpet_detected __initdata;
|
||||
|
||||
static int __init nvidia_hpet_check(unsigned long phys, unsigned long size)
|
||||
static int __init nvidia_hpet_check(struct acpi_table_header *header)
|
||||
{
|
||||
nvidia_hpet_detected = 1;
|
||||
return 0;
|
||||
@@ -30,7 +30,7 @@ static int __init check_bridge(int vendor, int device)
|
||||
is enabled. */
|
||||
if (!acpi_use_timer_override && vendor == PCI_VENDOR_ID_NVIDIA) {
|
||||
nvidia_hpet_detected = 0;
|
||||
acpi_table_parse(ACPI_HPET, nvidia_hpet_check);
|
||||
acpi_table_parse(ACPI_SIG_HPET, nvidia_hpet_check);
|
||||
if (nvidia_hpet_detected == 0) {
|
||||
acpi_skip_timer_override = 1;
|
||||
printk(KERN_INFO "Nvidia board "
|
||||
|
||||
@@ -190,7 +190,7 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index)
|
||||
/* Invoke C3 */
|
||||
inb(cx_address);
|
||||
/* Dummy op - must do something useless after P_LVL3 read */
|
||||
t = inl(acpi_fadt.xpm_tmr_blk.address);
|
||||
t = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
}
|
||||
/* Disable bus ratio bit */
|
||||
local_irq_disable();
|
||||
@@ -250,8 +250,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
||||
outb(3, 0x22);
|
||||
} else if ((pr != NULL) && pr->flags.bm_control) {
|
||||
/* Disable bus master arbitration */
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1,
|
||||
ACPI_MTX_DO_NOT_LOCK);
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
|
||||
}
|
||||
switch (longhaul_version) {
|
||||
|
||||
@@ -281,8 +280,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
||||
case TYPE_POWERSAVER:
|
||||
if (longhaul_flags & USE_ACPI_C3) {
|
||||
/* Don't allow wakeup */
|
||||
acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0,
|
||||
ACPI_MTX_DO_NOT_LOCK);
|
||||
acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
|
||||
do_powersaver(cx->address, clock_ratio_index);
|
||||
} else {
|
||||
do_powersaver(0, clock_ratio_index);
|
||||
@@ -295,8 +293,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
||||
outb(0, 0x22);
|
||||
} else if ((pr != NULL) && pr->flags.bm_control) {
|
||||
/* Enable bus master arbitration */
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0,
|
||||
ACPI_MTX_DO_NOT_LOCK);
|
||||
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
|
||||
}
|
||||
outb(pic2_mask,0xA1); /* restore mask */
|
||||
outb(pic1_mask,0x21);
|
||||
@@ -414,7 +411,7 @@ static int __init longhaul_get_ranges(void)
|
||||
highest_speed = calc_speed(maxmult);
|
||||
lowest_speed = calc_speed(minmult);
|
||||
dprintk ("FSB:%dMHz Lowest speed: %s Highest speed:%s\n", fsb,
|
||||
print_speed(lowest_speed/1000),
|
||||
print_speed(lowest_speed/1000),
|
||||
print_speed(highest_speed/1000));
|
||||
|
||||
if (lowest_speed == highest_speed) {
|
||||
@@ -498,7 +495,7 @@ static void __init longhaul_setup_voltagescaling(void)
|
||||
maxvid.mV/1000, maxvid.mV%1000,
|
||||
minvid.mV/1000, minvid.mV%1000,
|
||||
numvscales);
|
||||
|
||||
|
||||
j = 0;
|
||||
while (longhaul_table[j].frequency != CPUFREQ_TABLE_END) {
|
||||
speed = longhaul_table[j].frequency;
|
||||
|
||||
@@ -1057,7 +1057,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity)
|
||||
static int gsi_to_irq[MAX_GSI_NUM];
|
||||
|
||||
/* Don't set up the ACPI SCI because it's already set up */
|
||||
if (acpi_fadt.sci_int == gsi)
|
||||
if (acpi_gbl_FADT.sci_interrupt == gsi)
|
||||
return gsi;
|
||||
|
||||
ioapic = mp_find_ioapic(gsi);
|
||||
@@ -1114,7 +1114,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity)
|
||||
/*
|
||||
* Don't assign IRQ used by ACPI SCI
|
||||
*/
|
||||
if (gsi == acpi_fadt.sci_int)
|
||||
if (gsi == acpi_gbl_FADT.sci_interrupt)
|
||||
gsi = pci_irq++;
|
||||
gsi_to_irq[irq] = gsi;
|
||||
} else {
|
||||
|
||||
+41
-43
@@ -62,19 +62,19 @@ extern void * boot_ioremap(unsigned long, unsigned long);
|
||||
/* Identify CPU proximity domains */
|
||||
static void __init parse_cpu_affinity_structure(char *p)
|
||||
{
|
||||
struct acpi_table_processor_affinity *cpu_affinity =
|
||||
(struct acpi_table_processor_affinity *) p;
|
||||
struct acpi_srat_cpu_affinity *cpu_affinity =
|
||||
(struct acpi_srat_cpu_affinity *) p;
|
||||
|
||||
if (!cpu_affinity->flags.enabled)
|
||||
if ((cpu_affinity->flags & ACPI_SRAT_CPU_ENABLED) == 0)
|
||||
return; /* empty entry */
|
||||
|
||||
/* mark this node as "seen" in node bitmap */
|
||||
BMAP_SET(pxm_bitmap, cpu_affinity->proximity_domain);
|
||||
BMAP_SET(pxm_bitmap, cpu_affinity->proximity_domain_lo);
|
||||
|
||||
apicid_to_pxm[cpu_affinity->apic_id] = cpu_affinity->proximity_domain;
|
||||
apicid_to_pxm[cpu_affinity->apic_id] = cpu_affinity->proximity_domain_lo;
|
||||
|
||||
printk("CPU 0x%02X in proximity domain 0x%02X\n",
|
||||
cpu_affinity->apic_id, cpu_affinity->proximity_domain);
|
||||
cpu_affinity->apic_id, cpu_affinity->proximity_domain_lo);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -84,28 +84,27 @@ static void __init parse_cpu_affinity_structure(char *p)
|
||||
static void __init parse_memory_affinity_structure (char *sratp)
|
||||
{
|
||||
unsigned long long paddr, size;
|
||||
unsigned long start_pfn, end_pfn;
|
||||
unsigned long start_pfn, end_pfn;
|
||||
u8 pxm;
|
||||
struct node_memory_chunk_s *p, *q, *pend;
|
||||
struct acpi_table_memory_affinity *memory_affinity =
|
||||
(struct acpi_table_memory_affinity *) sratp;
|
||||
struct acpi_srat_mem_affinity *memory_affinity =
|
||||
(struct acpi_srat_mem_affinity *) sratp;
|
||||
|
||||
if (!memory_affinity->flags.enabled)
|
||||
if ((memory_affinity->flags & ACPI_SRAT_MEM_ENABLED) == 0)
|
||||
return; /* empty entry */
|
||||
|
||||
pxm = memory_affinity->proximity_domain & 0xff;
|
||||
|
||||
/* mark this node as "seen" in node bitmap */
|
||||
BMAP_SET(pxm_bitmap, memory_affinity->proximity_domain);
|
||||
BMAP_SET(pxm_bitmap, pxm);
|
||||
|
||||
/* calculate info for memory chunk structure */
|
||||
paddr = memory_affinity->base_addr_hi;
|
||||
paddr = (paddr << 32) | memory_affinity->base_addr_lo;
|
||||
size = memory_affinity->length_hi;
|
||||
size = (size << 32) | memory_affinity->length_lo;
|
||||
|
||||
paddr = memory_affinity->base_address;
|
||||
size = memory_affinity->length;
|
||||
|
||||
start_pfn = paddr >> PAGE_SHIFT;
|
||||
end_pfn = (paddr + size) >> PAGE_SHIFT;
|
||||
|
||||
pxm = memory_affinity->proximity_domain;
|
||||
|
||||
|
||||
if (num_memory_chunks >= MAXCHUNKS) {
|
||||
printk("Too many mem chunks in SRAT. Ignoring %lld MBytes at %llx\n",
|
||||
@@ -132,8 +131,8 @@ static void __init parse_memory_affinity_structure (char *sratp)
|
||||
printk("Memory range 0x%lX to 0x%lX (type 0x%X) in proximity domain 0x%02X %s\n",
|
||||
start_pfn, end_pfn,
|
||||
memory_affinity->memory_type,
|
||||
memory_affinity->proximity_domain,
|
||||
(memory_affinity->flags.hot_pluggable ?
|
||||
pxm,
|
||||
((memory_affinity->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) ?
|
||||
"enabled and removable" : "enabled" ) );
|
||||
}
|
||||
|
||||
@@ -185,10 +184,10 @@ static int __init acpi20_parse_srat(struct acpi_table_srat *sratp)
|
||||
num_memory_chunks = 0;
|
||||
while (p < end) {
|
||||
switch (*p) {
|
||||
case ACPI_SRAT_PROCESSOR_AFFINITY:
|
||||
case ACPI_SRAT_TYPE_CPU_AFFINITY:
|
||||
parse_cpu_affinity_structure(p);
|
||||
break;
|
||||
case ACPI_SRAT_MEMORY_AFFINITY:
|
||||
case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
|
||||
parse_memory_affinity_structure(p);
|
||||
break;
|
||||
default:
|
||||
@@ -262,31 +261,30 @@ out_fail:
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct acpi_static_rsdt {
|
||||
struct acpi_table_rsdt table;
|
||||
u32 padding[7]; /* Allow for 7 more table entries */
|
||||
};
|
||||
|
||||
int __init get_memcfg_from_srat(void)
|
||||
{
|
||||
struct acpi_table_header *header = NULL;
|
||||
struct acpi_table_rsdp *rsdp = NULL;
|
||||
struct acpi_table_rsdt *rsdt = NULL;
|
||||
struct acpi_pointer *rsdp_address = NULL;
|
||||
struct acpi_table_rsdt saved_rsdt;
|
||||
acpi_native_uint rsdp_address = 0;
|
||||
struct acpi_static_rsdt saved_rsdt;
|
||||
int tables = 0;
|
||||
int i = 0;
|
||||
|
||||
if (ACPI_FAILURE(acpi_find_root_pointer(ACPI_PHYSICAL_ADDRESSING,
|
||||
rsdp_address))) {
|
||||
rsdp_address = acpi_find_rsdp();
|
||||
if (!rsdp_address) {
|
||||
printk("%s: System description tables not found\n",
|
||||
__FUNCTION__);
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (rsdp_address->pointer_type == ACPI_PHYSICAL_POINTER) {
|
||||
printk("%s: assigning address to rsdp\n", __FUNCTION__);
|
||||
rsdp = (struct acpi_table_rsdp *)
|
||||
(u32)rsdp_address->pointer.physical;
|
||||
} else {
|
||||
printk("%s: rsdp_address is not a physical pointer\n", __FUNCTION__);
|
||||
goto out_err;
|
||||
}
|
||||
printk("%s: assigning address to rsdp\n", __FUNCTION__);
|
||||
rsdp = (struct acpi_table_rsdp *)(u32)rsdp_address;
|
||||
if (!rsdp) {
|
||||
printk("%s: Didn't find ACPI root!\n", __FUNCTION__);
|
||||
goto out_err;
|
||||
@@ -295,13 +293,13 @@ int __init get_memcfg_from_srat(void)
|
||||
printk(KERN_INFO "%.8s v%d [%.6s]\n", rsdp->signature, rsdp->revision,
|
||||
rsdp->oem_id);
|
||||
|
||||
if (strncmp(rsdp->signature, RSDP_SIG,strlen(RSDP_SIG))) {
|
||||
if (strncmp(rsdp->signature, ACPI_SIG_RSDP,strlen(ACPI_SIG_RSDP))) {
|
||||
printk(KERN_WARNING "%s: RSDP table signature incorrect\n", __FUNCTION__);
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
rsdt = (struct acpi_table_rsdt *)
|
||||
boot_ioremap(rsdp->rsdt_address, sizeof(struct acpi_table_rsdt));
|
||||
boot_ioremap(rsdp->rsdt_physical_address, sizeof(struct acpi_table_rsdt));
|
||||
|
||||
if (!rsdt) {
|
||||
printk(KERN_WARNING
|
||||
@@ -310,9 +308,9 @@ int __init get_memcfg_from_srat(void)
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
header = & rsdt->header;
|
||||
header = &rsdt->header;
|
||||
|
||||
if (strncmp(header->signature, RSDT_SIG, strlen(RSDT_SIG))) {
|
||||
if (strncmp(header->signature, ACPI_SIG_RSDT, strlen(ACPI_SIG_RSDT))) {
|
||||
printk(KERN_WARNING "ACPI: RSDT signature incorrect\n");
|
||||
goto out_err;
|
||||
}
|
||||
@@ -330,9 +328,9 @@ int __init get_memcfg_from_srat(void)
|
||||
|
||||
memcpy(&saved_rsdt, rsdt, sizeof(saved_rsdt));
|
||||
|
||||
if (saved_rsdt.header.length > sizeof(saved_rsdt)) {
|
||||
if (saved_rsdt.table.header.length > sizeof(saved_rsdt)) {
|
||||
printk(KERN_WARNING "ACPI: Too big length in RSDT: %d\n",
|
||||
saved_rsdt.header.length);
|
||||
saved_rsdt.table.header.length);
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
@@ -341,15 +339,15 @@ int __init get_memcfg_from_srat(void)
|
||||
for (i = 0; i < tables; i++) {
|
||||
/* Map in header, then map in full table length. */
|
||||
header = (struct acpi_table_header *)
|
||||
boot_ioremap(saved_rsdt.entry[i], sizeof(struct acpi_table_header));
|
||||
boot_ioremap(saved_rsdt.table.table_offset_entry[i], sizeof(struct acpi_table_header));
|
||||
if (!header)
|
||||
break;
|
||||
header = (struct acpi_table_header *)
|
||||
boot_ioremap(saved_rsdt.entry[i], header->length);
|
||||
boot_ioremap(saved_rsdt.table.table_offset_entry[i], header->length);
|
||||
if (!header)
|
||||
break;
|
||||
|
||||
if (strncmp((char *) &header->signature, "SRAT", 4))
|
||||
if (strncmp((char *) &header->signature, ACPI_SIG_SRAT, 4))
|
||||
continue;
|
||||
|
||||
/* we've found the srat table. don't need to look at any more tables */
|
||||
|
||||
@@ -84,15 +84,6 @@ struct es7000_oem_table {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
struct acpi_table_sdt {
|
||||
unsigned long pa;
|
||||
unsigned long count;
|
||||
struct {
|
||||
unsigned long pa;
|
||||
enum acpi_table_id id;
|
||||
unsigned long size;
|
||||
} entry[50];
|
||||
};
|
||||
|
||||
struct oem_table {
|
||||
struct acpi_table_header Header;
|
||||
|
||||
@@ -160,51 +160,14 @@ parse_unisys_oem (char *oemptr)
|
||||
int __init
|
||||
find_unisys_acpi_oem_table(unsigned long *oem_addr)
|
||||
{
|
||||
struct acpi_table_rsdp *rsdp = NULL;
|
||||
unsigned long rsdp_phys = 0;
|
||||
struct acpi_table_header *header = NULL;
|
||||
int i;
|
||||
struct acpi_table_sdt sdt;
|
||||
|
||||
rsdp_phys = acpi_find_rsdp();
|
||||
rsdp = __va(rsdp_phys);
|
||||
if (rsdp->rsdt_address) {
|
||||
struct acpi_table_rsdt *mapped_rsdt = NULL;
|
||||
sdt.pa = rsdp->rsdt_address;
|
||||
|
||||
header = (struct acpi_table_header *)
|
||||
__acpi_map_table(sdt.pa, sizeof(struct acpi_table_header));
|
||||
if (!header)
|
||||
return -ENODEV;
|
||||
|
||||
sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 3;
|
||||
mapped_rsdt = (struct acpi_table_rsdt *)
|
||||
__acpi_map_table(sdt.pa, header->length);
|
||||
if (!mapped_rsdt)
|
||||
return -ENODEV;
|
||||
|
||||
header = &mapped_rsdt->header;
|
||||
|
||||
for (i = 0; i < sdt.count; i++)
|
||||
sdt.entry[i].pa = (unsigned long) mapped_rsdt->entry[i];
|
||||
};
|
||||
for (i = 0; i < sdt.count; i++) {
|
||||
|
||||
header = (struct acpi_table_header *)
|
||||
__acpi_map_table(sdt.entry[i].pa,
|
||||
sizeof(struct acpi_table_header));
|
||||
if (!header)
|
||||
continue;
|
||||
if (!strncmp((char *) &header->signature, "OEM1", 4)) {
|
||||
if (!strncmp((char *) &header->oem_id, "UNISYS", 6)) {
|
||||
void *addr;
|
||||
struct oem_table *t;
|
||||
acpi_table_print(header, sdt.entry[i].pa);
|
||||
t = (struct oem_table *) __acpi_map_table(sdt.entry[i].pa, header->length);
|
||||
addr = (void *) __acpi_map_table(t->OEMTableAddr, t->OEMTableSize);
|
||||
*oem_addr = (unsigned long) addr;
|
||||
return 0;
|
||||
}
|
||||
struct acpi_table_header *header = NULL;
|
||||
int i = 0;
|
||||
while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) {
|
||||
if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) {
|
||||
struct oem_table *t = (struct oem_table *)header;
|
||||
*oem_addr = (unsigned long)__acpi_map_table(t->OEMTableAddr,
|
||||
t->OEMTableSize);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
|
||||
+12
-12
@@ -36,7 +36,7 @@ static DECLARE_BITMAP(fallback_slots, MAX_CHECK_BUS*32);
|
||||
static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
|
||||
{
|
||||
int cfg_num = -1;
|
||||
struct acpi_table_mcfg_config *cfg;
|
||||
struct acpi_mcfg_allocation *cfg;
|
||||
|
||||
if (seg == 0 && bus < MAX_CHECK_BUS &&
|
||||
test_bit(PCI_SLOT(devfn) + 32*bus, fallback_slots))
|
||||
@@ -48,11 +48,11 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
|
||||
break;
|
||||
}
|
||||
cfg = &pci_mmcfg_config[cfg_num];
|
||||
if (cfg->pci_segment_group_number != seg)
|
||||
if (cfg->pci_segment != seg)
|
||||
continue;
|
||||
if ((cfg->start_bus_number <= bus) &&
|
||||
(cfg->end_bus_number >= bus))
|
||||
return cfg->base_address;
|
||||
return cfg->address;
|
||||
}
|
||||
|
||||
/* Handle more broken MCFG tables on Asus etc.
|
||||
@@ -60,9 +60,9 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
|
||||
this applies to all busses. */
|
||||
cfg = &pci_mmcfg_config[0];
|
||||
if (pci_mmcfg_config_num == 1 &&
|
||||
cfg->pci_segment_group_number == 0 &&
|
||||
cfg->pci_segment == 0 &&
|
||||
(cfg->start_bus_number | cfg->end_bus_number) == 0)
|
||||
return cfg->base_address;
|
||||
return cfg->address;
|
||||
|
||||
/* Fall back to type 0 */
|
||||
return 0;
|
||||
@@ -125,7 +125,7 @@ static int pci_mmcfg_write(unsigned int seg, unsigned int bus,
|
||||
unsigned long flags;
|
||||
u32 base;
|
||||
|
||||
if ((bus > 255) || (devfn > 255) || (reg > 4095))
|
||||
if ((bus > 255) || (devfn > 255) || (reg > 4095))
|
||||
return -EINVAL;
|
||||
|
||||
base = get_base_addr(seg, bus, devfn);
|
||||
@@ -199,19 +199,19 @@ void __init pci_mmcfg_init(int type)
|
||||
if ((pci_probe & PCI_PROBE_MMCONF) == 0)
|
||||
return;
|
||||
|
||||
acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg);
|
||||
acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
|
||||
if ((pci_mmcfg_config_num == 0) ||
|
||||
(pci_mmcfg_config == NULL) ||
|
||||
(pci_mmcfg_config[0].base_address == 0))
|
||||
(pci_mmcfg_config[0].address == 0))
|
||||
return;
|
||||
|
||||
/* Only do this check when type 1 works. If it doesn't work
|
||||
assume we run on a Mac and always use MCFG */
|
||||
if (type == 1 && !e820_all_mapped(pci_mmcfg_config[0].base_address,
|
||||
pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN,
|
||||
if (type == 1 && !e820_all_mapped(pci_mmcfg_config[0].address,
|
||||
pci_mmcfg_config[0].address + MMCONFIG_APER_MIN,
|
||||
E820_RESERVED)) {
|
||||
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n",
|
||||
pci_mmcfg_config[0].base_address);
|
||||
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %lx is not E820-reserved\n",
|
||||
(unsigned long)pci_mmcfg_config[0].address);
|
||||
printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
+92
-108
@@ -55,7 +55,7 @@
|
||||
|
||||
#define BAD_MADT_ENTRY(entry, end) ( \
|
||||
(!entry) || (unsigned long)entry + sizeof(*entry) > end || \
|
||||
((acpi_table_entry_header *)entry)->length < sizeof(*entry))
|
||||
((struct acpi_subtable_header *)entry)->length < sizeof(*entry))
|
||||
|
||||
#define PREFIX "ACPI: "
|
||||
|
||||
@@ -67,16 +67,11 @@ EXPORT_SYMBOL(pm_power_off);
|
||||
unsigned int acpi_cpei_override;
|
||||
unsigned int acpi_cpei_phys_cpuid;
|
||||
|
||||
#define MAX_SAPICS 256
|
||||
u16 ia64_acpiid_to_sapicid[MAX_SAPICS] = {[0 ... MAX_SAPICS - 1] = -1 };
|
||||
|
||||
EXPORT_SYMBOL(ia64_acpiid_to_sapicid);
|
||||
|
||||
const char *acpi_get_sysname(void)
|
||||
{
|
||||
#ifdef CONFIG_IA64_GENERIC
|
||||
unsigned long rsdp_phys;
|
||||
struct acpi20_table_rsdp *rsdp;
|
||||
struct acpi_table_rsdp *rsdp;
|
||||
struct acpi_table_xsdt *xsdt;
|
||||
struct acpi_table_header *hdr;
|
||||
|
||||
@@ -87,16 +82,16 @@ const char *acpi_get_sysname(void)
|
||||
return "dig";
|
||||
}
|
||||
|
||||
rsdp = (struct acpi20_table_rsdp *)__va(rsdp_phys);
|
||||
if (strncmp(rsdp->signature, RSDP_SIG, sizeof(RSDP_SIG) - 1)) {
|
||||
rsdp = (struct acpi_table_rsdp *)__va(rsdp_phys);
|
||||
if (strncmp(rsdp->signature, ACPI_SIG_RSDP, sizeof(ACPI_SIG_RSDP) - 1)) {
|
||||
printk(KERN_ERR
|
||||
"ACPI 2.0 RSDP signature incorrect, default to \"dig\"\n");
|
||||
return "dig";
|
||||
}
|
||||
|
||||
xsdt = (struct acpi_table_xsdt *)__va(rsdp->xsdt_address);
|
||||
xsdt = (struct acpi_table_xsdt *)__va(rsdp->xsdt_physical_address);
|
||||
hdr = &xsdt->header;
|
||||
if (strncmp(hdr->signature, XSDT_SIG, sizeof(XSDT_SIG) - 1)) {
|
||||
if (strncmp(hdr->signature, ACPI_SIG_XSDT, sizeof(ACPI_SIG_XSDT) - 1)) {
|
||||
printk(KERN_ERR
|
||||
"ACPI 2.0 XSDT signature incorrect, default to \"dig\"\n");
|
||||
return "dig";
|
||||
@@ -169,12 +164,12 @@ struct acpi_table_madt *acpi_madt __initdata;
|
||||
static u8 has_8259;
|
||||
|
||||
static int __init
|
||||
acpi_parse_lapic_addr_ovr(acpi_table_entry_header * header,
|
||||
acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_table_lapic_addr_ovr *lapic;
|
||||
struct acpi_madt_local_apic_override *lapic;
|
||||
|
||||
lapic = (struct acpi_table_lapic_addr_ovr *)header;
|
||||
lapic = (struct acpi_madt_local_apic_override *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(lapic, end))
|
||||
return -EINVAL;
|
||||
@@ -187,22 +182,19 @@ acpi_parse_lapic_addr_ovr(acpi_table_entry_header * header,
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_lsapic(acpi_table_entry_header * header, const unsigned long end)
|
||||
acpi_parse_lsapic(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
struct acpi_table_lsapic *lsapic;
|
||||
struct acpi_madt_local_sapic *lsapic;
|
||||
|
||||
lsapic = (struct acpi_table_lsapic *)header;
|
||||
lsapic = (struct acpi_madt_local_sapic *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(lsapic, end))
|
||||
return -EINVAL;
|
||||
/*Skip BAD_MADT_ENTRY check, as lsapic size could vary */
|
||||
|
||||
if (lsapic->flags.enabled) {
|
||||
if (lsapic->lapic_flags & ACPI_MADT_ENABLED) {
|
||||
#ifdef CONFIG_SMP
|
||||
smp_boot_data.cpu_phys_id[available_cpus] =
|
||||
(lsapic->id << 8) | lsapic->eid;
|
||||
#endif
|
||||
ia64_acpiid_to_sapicid[lsapic->acpi_id] =
|
||||
(lsapic->id << 8) | lsapic->eid;
|
||||
++available_cpus;
|
||||
}
|
||||
|
||||
@@ -211,11 +203,11 @@ acpi_parse_lsapic(acpi_table_entry_header * header, const unsigned long end)
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_lapic_nmi(acpi_table_entry_header * header, const unsigned long end)
|
||||
acpi_parse_lapic_nmi(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
struct acpi_table_lapic_nmi *lacpi_nmi;
|
||||
struct acpi_madt_local_apic_nmi *lacpi_nmi;
|
||||
|
||||
lacpi_nmi = (struct acpi_table_lapic_nmi *)header;
|
||||
lacpi_nmi = (struct acpi_madt_local_apic_nmi *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(lacpi_nmi, end))
|
||||
return -EINVAL;
|
||||
@@ -225,11 +217,11 @@ acpi_parse_lapic_nmi(acpi_table_entry_header * header, const unsigned long end)
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_iosapic(acpi_table_entry_header * header, const unsigned long end)
|
||||
acpi_parse_iosapic(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
struct acpi_table_iosapic *iosapic;
|
||||
struct acpi_madt_io_sapic *iosapic;
|
||||
|
||||
iosapic = (struct acpi_table_iosapic *)header;
|
||||
iosapic = (struct acpi_madt_io_sapic *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(iosapic, end))
|
||||
return -EINVAL;
|
||||
@@ -240,13 +232,13 @@ acpi_parse_iosapic(acpi_table_entry_header * header, const unsigned long end)
|
||||
static unsigned int __initdata acpi_madt_rev;
|
||||
|
||||
static int __init
|
||||
acpi_parse_plat_int_src(acpi_table_entry_header * header,
|
||||
acpi_parse_plat_int_src(struct acpi_subtable_header * header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_table_plat_int_src *plintsrc;
|
||||
struct acpi_madt_interrupt_source *plintsrc;
|
||||
int vector;
|
||||
|
||||
plintsrc = (struct acpi_table_plat_int_src *)header;
|
||||
plintsrc = (struct acpi_madt_interrupt_source *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(plintsrc, end))
|
||||
return -EINVAL;
|
||||
@@ -257,19 +249,19 @@ acpi_parse_plat_int_src(acpi_table_entry_header * header,
|
||||
*/
|
||||
vector = iosapic_register_platform_intr(plintsrc->type,
|
||||
plintsrc->global_irq,
|
||||
plintsrc->iosapic_vector,
|
||||
plintsrc->io_sapic_vector,
|
||||
plintsrc->eid,
|
||||
plintsrc->id,
|
||||
(plintsrc->flags.polarity ==
|
||||
1) ? IOSAPIC_POL_HIGH :
|
||||
IOSAPIC_POL_LOW,
|
||||
(plintsrc->flags.trigger ==
|
||||
1) ? IOSAPIC_EDGE :
|
||||
IOSAPIC_LEVEL);
|
||||
((plintsrc->inti_flags & ACPI_MADT_POLARITY_MASK) ==
|
||||
ACPI_MADT_POLARITY_ACTIVE_HIGH) ?
|
||||
IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
|
||||
((plintsrc->inti_flags & ACPI_MADT_TRIGGER_MASK) ==
|
||||
ACPI_MADT_TRIGGER_EDGE) ?
|
||||
IOSAPIC_EDGE : IOSAPIC_LEVEL);
|
||||
|
||||
platform_intr_list[plintsrc->type] = vector;
|
||||
if (acpi_madt_rev > 1) {
|
||||
acpi_cpei_override = plintsrc->plint_flags.cpei_override_flag;
|
||||
acpi_cpei_override = plintsrc->flags & ACPI_MADT_CPEI_OVERRIDE;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -324,30 +316,32 @@ unsigned int get_cpei_target_cpu(void)
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_int_src_ovr(acpi_table_entry_header * header,
|
||||
acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
|
||||
const unsigned long end)
|
||||
{
|
||||
struct acpi_table_int_src_ovr *p;
|
||||
struct acpi_madt_interrupt_override *p;
|
||||
|
||||
p = (struct acpi_table_int_src_ovr *)header;
|
||||
p = (struct acpi_madt_interrupt_override *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(p, end))
|
||||
return -EINVAL;
|
||||
|
||||
iosapic_override_isa_irq(p->bus_irq, p->global_irq,
|
||||
(p->flags.polarity ==
|
||||
1) ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
|
||||
(p->flags.trigger ==
|
||||
1) ? IOSAPIC_EDGE : IOSAPIC_LEVEL);
|
||||
iosapic_override_isa_irq(p->source_irq, p->global_irq,
|
||||
((p->inti_flags & ACPI_MADT_POLARITY_MASK) ==
|
||||
ACPI_MADT_POLARITY_ACTIVE_HIGH) ?
|
||||
IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW,
|
||||
((p->inti_flags & ACPI_MADT_TRIGGER_MASK) ==
|
||||
ACPI_MADT_TRIGGER_EDGE) ?
|
||||
IOSAPIC_EDGE : IOSAPIC_LEVEL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init
|
||||
acpi_parse_nmi_src(acpi_table_entry_header * header, const unsigned long end)
|
||||
acpi_parse_nmi_src(struct acpi_subtable_header * header, const unsigned long end)
|
||||
{
|
||||
struct acpi_table_nmi_src *nmi_src;
|
||||
struct acpi_madt_nmi_source *nmi_src;
|
||||
|
||||
nmi_src = (struct acpi_table_nmi_src *)header;
|
||||
nmi_src = (struct acpi_madt_nmi_source *)header;
|
||||
|
||||
if (BAD_MADT_ENTRY(nmi_src, end))
|
||||
return -EINVAL;
|
||||
@@ -371,12 +365,12 @@ static void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||
}
|
||||
}
|
||||
|
||||
static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
|
||||
static int __init acpi_parse_madt(struct acpi_table_header *table)
|
||||
{
|
||||
if (!phys_addr || !size)
|
||||
if (!table)
|
||||
return -EINVAL;
|
||||
|
||||
acpi_madt = (struct acpi_table_madt *)__va(phys_addr);
|
||||
acpi_madt = (struct acpi_table_madt *)table;
|
||||
|
||||
acpi_madt_rev = acpi_madt->header.revision;
|
||||
|
||||
@@ -384,14 +378,14 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
|
||||
#ifdef CONFIG_ITANIUM
|
||||
has_8259 = 1; /* Firmware on old Itanium systems is broken */
|
||||
#else
|
||||
has_8259 = acpi_madt->flags.pcat_compat;
|
||||
has_8259 = acpi_madt->flags & ACPI_MADT_PCAT_COMPAT;
|
||||
#endif
|
||||
iosapic_system_init(has_8259);
|
||||
|
||||
/* Get base address of IPI Message Block */
|
||||
|
||||
if (acpi_madt->lapic_address)
|
||||
ipi_base_addr = ioremap(acpi_madt->lapic_address, 0);
|
||||
if (acpi_madt->address)
|
||||
ipi_base_addr = ioremap(acpi_madt->address, 0);
|
||||
|
||||
printk(KERN_INFO PREFIX "Local APIC address %p\n", ipi_base_addr);
|
||||
|
||||
@@ -413,23 +407,24 @@ static u32 __devinitdata pxm_flag[PXM_FLAG_LEN];
|
||||
#define pxm_bit_test(bit) (test_bit(bit,(void *)pxm_flag))
|
||||
static struct acpi_table_slit __initdata *slit_table;
|
||||
|
||||
static int get_processor_proximity_domain(struct acpi_table_processor_affinity *pa)
|
||||
static int get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)
|
||||
{
|
||||
int pxm;
|
||||
|
||||
pxm = pa->proximity_domain;
|
||||
pxm = pa->proximity_domain_lo;
|
||||
if (ia64_platform_is("sn2"))
|
||||
pxm += pa->reserved[0] << 8;
|
||||
pxm += pa->proximity_domain_hi[0] << 8;
|
||||
return pxm;
|
||||
}
|
||||
|
||||
static int get_memory_proximity_domain(struct acpi_table_memory_affinity *ma)
|
||||
static int get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)
|
||||
{
|
||||
int pxm;
|
||||
|
||||
pxm = ma->proximity_domain;
|
||||
if (ia64_platform_is("sn2"))
|
||||
pxm += ma->reserved1[0] << 8;
|
||||
if (!ia64_platform_is("sn2"))
|
||||
pxm &= 0xff;
|
||||
|
||||
return pxm;
|
||||
}
|
||||
|
||||
@@ -442,7 +437,7 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
|
||||
u32 len;
|
||||
|
||||
len = sizeof(struct acpi_table_header) + 8
|
||||
+ slit->localities * slit->localities;
|
||||
+ slit->locality_count * slit->locality_count;
|
||||
if (slit->header.length != len) {
|
||||
printk(KERN_ERR
|
||||
"ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n",
|
||||
@@ -454,11 +449,11 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
|
||||
}
|
||||
|
||||
void __init
|
||||
acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
|
||||
acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
|
||||
{
|
||||
int pxm;
|
||||
|
||||
if (!pa->flags.enabled)
|
||||
if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
|
||||
return;
|
||||
|
||||
pxm = get_processor_proximity_domain(pa);
|
||||
@@ -467,14 +462,14 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
|
||||
pxm_bit_set(pxm);
|
||||
|
||||
node_cpuid[srat_num_cpus].phys_id =
|
||||
(pa->apic_id << 8) | (pa->lsapic_eid);
|
||||
(pa->apic_id << 8) | (pa->local_sapic_eid);
|
||||
/* nid should be overridden as logical node id later */
|
||||
node_cpuid[srat_num_cpus].nid = pxm;
|
||||
srat_num_cpus++;
|
||||
}
|
||||
|
||||
void __init
|
||||
acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
|
||||
acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
|
||||
{
|
||||
unsigned long paddr, size;
|
||||
int pxm;
|
||||
@@ -483,13 +478,11 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
|
||||
pxm = get_memory_proximity_domain(ma);
|
||||
|
||||
/* fill node memory chunk structure */
|
||||
paddr = ma->base_addr_hi;
|
||||
paddr = (paddr << 32) | ma->base_addr_lo;
|
||||
size = ma->length_hi;
|
||||
size = (size << 32) | ma->length_lo;
|
||||
paddr = ma->base_address;
|
||||
size = ma->length;
|
||||
|
||||
/* Ignore disabled entries */
|
||||
if (!ma->flags.enabled)
|
||||
if (!(ma->flags & ACPI_SRAT_MEM_ENABLED))
|
||||
return;
|
||||
|
||||
/* record this node in proximity bitmap */
|
||||
@@ -560,16 +553,16 @@ void __init acpi_numa_arch_fixup(void)
|
||||
if (!slit_table)
|
||||
return;
|
||||
memset(numa_slit, -1, sizeof(numa_slit));
|
||||
for (i = 0; i < slit_table->localities; i++) {
|
||||
for (i = 0; i < slit_table->locality_count; i++) {
|
||||
if (!pxm_bit_test(i))
|
||||
continue;
|
||||
node_from = pxm_to_node(i);
|
||||
for (j = 0; j < slit_table->localities; j++) {
|
||||
for (j = 0; j < slit_table->locality_count; j++) {
|
||||
if (!pxm_bit_test(j))
|
||||
continue;
|
||||
node_to = pxm_to_node(j);
|
||||
node_distance(node_from, node_to) =
|
||||
slit_table->entry[i * slit_table->localities + j];
|
||||
slit_table->entry[i * slit_table->locality_count + j];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -617,21 +610,21 @@ void acpi_unregister_gsi(u32 gsi)
|
||||
|
||||
EXPORT_SYMBOL(acpi_unregister_gsi);
|
||||
|
||||
static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size)
|
||||
static int __init acpi_parse_fadt(struct acpi_table_header *table)
|
||||
{
|
||||
struct acpi_table_header *fadt_header;
|
||||
struct fadt_descriptor *fadt;
|
||||
struct acpi_table_fadt *fadt;
|
||||
|
||||
if (!phys_addr || !size)
|
||||
if (!table)
|
||||
return -EINVAL;
|
||||
|
||||
fadt_header = (struct acpi_table_header *)__va(phys_addr);
|
||||
fadt_header = (struct acpi_table_header *)table;
|
||||
if (fadt_header->revision != 3)
|
||||
return -ENODEV; /* Only deal with ACPI 2.0 FADT */
|
||||
|
||||
fadt = (struct fadt_descriptor *)fadt_header;
|
||||
fadt = (struct acpi_table_fadt *)fadt_header;
|
||||
|
||||
acpi_register_gsi(fadt->sci_int, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW);
|
||||
acpi_register_gsi(fadt->sci_interrupt, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -658,7 +651,7 @@ int __init acpi_boot_init(void)
|
||||
* information -- the successor to MPS tables.
|
||||
*/
|
||||
|
||||
if (acpi_table_parse(ACPI_APIC, acpi_parse_madt) < 1) {
|
||||
if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt) < 1) {
|
||||
printk(KERN_ERR PREFIX "Can't find MADT\n");
|
||||
goto skip_madt;
|
||||
}
|
||||
@@ -666,40 +659,40 @@ int __init acpi_boot_init(void)
|
||||
/* Local APIC */
|
||||
|
||||
if (acpi_table_parse_madt
|
||||
(ACPI_MADT_LAPIC_ADDR_OVR, acpi_parse_lapic_addr_ovr, 0) < 0)
|
||||
(ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE, acpi_parse_lapic_addr_ovr, 0) < 0)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Error parsing LAPIC address override entry\n");
|
||||
|
||||
if (acpi_table_parse_madt(ACPI_MADT_LSAPIC, acpi_parse_lsapic, NR_CPUS)
|
||||
if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC, acpi_parse_lsapic, NR_CPUS)
|
||||
< 1)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Error parsing MADT - no LAPIC entries\n");
|
||||
|
||||
if (acpi_table_parse_madt(ACPI_MADT_LAPIC_NMI, acpi_parse_lapic_nmi, 0)
|
||||
if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0)
|
||||
< 0)
|
||||
printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
|
||||
|
||||
/* I/O APIC */
|
||||
|
||||
if (acpi_table_parse_madt
|
||||
(ACPI_MADT_IOSAPIC, acpi_parse_iosapic, NR_IOSAPICS) < 1)
|
||||
(ACPI_MADT_TYPE_IO_SAPIC, acpi_parse_iosapic, NR_IOSAPICS) < 1)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Error parsing MADT - no IOSAPIC entries\n");
|
||||
|
||||
/* System-Level Interrupt Routing */
|
||||
|
||||
if (acpi_table_parse_madt
|
||||
(ACPI_MADT_PLAT_INT_SRC, acpi_parse_plat_int_src,
|
||||
(ACPI_MADT_TYPE_INTERRUPT_SOURCE, acpi_parse_plat_int_src,
|
||||
ACPI_MAX_PLATFORM_INTERRUPTS) < 0)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Error parsing platform interrupt source entry\n");
|
||||
|
||||
if (acpi_table_parse_madt
|
||||
(ACPI_MADT_INT_SRC_OVR, acpi_parse_int_src_ovr, 0) < 0)
|
||||
(ACPI_MADT_TYPE_INTERRUPT_OVERRIDE, acpi_parse_int_src_ovr, 0) < 0)
|
||||
printk(KERN_ERR PREFIX
|
||||
"Error parsing interrupt source overrides entry\n");
|
||||
|
||||
if (acpi_table_parse_madt(ACPI_MADT_NMI_SRC, acpi_parse_nmi_src, 0) < 0)
|
||||
if (acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE, acpi_parse_nmi_src, 0) < 0)
|
||||
printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n");
|
||||
skip_madt:
|
||||
|
||||
@@ -709,7 +702,7 @@ int __init acpi_boot_init(void)
|
||||
* gets interrupts such as power and sleep buttons. If it's not
|
||||
* on a Legacy interrupt, it needs to be setup.
|
||||
*/
|
||||
if (acpi_table_parse(ACPI_FADT, acpi_parse_fadt) < 1)
|
||||
if (acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt) < 1)
|
||||
printk(KERN_ERR PREFIX "Can't find FADT\n");
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -842,7 +835,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *obj;
|
||||
struct acpi_table_lsapic *lsapic;
|
||||
struct acpi_madt_local_sapic *lsapic;
|
||||
cpumask_t tmp_map;
|
||||
long physid;
|
||||
int cpu;
|
||||
@@ -854,16 +847,16 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
|
||||
return -EINVAL;
|
||||
|
||||
obj = buffer.pointer;
|
||||
if (obj->type != ACPI_TYPE_BUFFER ||
|
||||
obj->buffer.length < sizeof(*lsapic)) {
|
||||
if (obj->type != ACPI_TYPE_BUFFER)
|
||||
{
|
||||
kfree(buffer.pointer);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
lsapic = (struct acpi_table_lsapic *)obj->buffer.pointer;
|
||||
lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer;
|
||||
|
||||
if ((lsapic->header.type != ACPI_MADT_LSAPIC) ||
|
||||
(!lsapic->flags.enabled)) {
|
||||
if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) ||
|
||||
(!lsapic->lapic_flags & ACPI_MADT_ENABLED)) {
|
||||
kfree(buffer.pointer);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -883,7 +876,6 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
|
||||
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
ia64_cpu_to_sapicid[cpu] = physid;
|
||||
ia64_acpiid_to_sapicid[lsapic->acpi_id] = ia64_cpu_to_sapicid[cpu];
|
||||
|
||||
*pcpu = cpu;
|
||||
return (0);
|
||||
@@ -893,14 +885,6 @@ EXPORT_SYMBOL(acpi_map_lsapic);
|
||||
|
||||
int acpi_unmap_lsapic(int cpu)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_SAPICS; i++) {
|
||||
if (ia64_acpiid_to_sapicid[i] == ia64_cpu_to_sapicid[cpu]) {
|
||||
ia64_acpiid_to_sapicid[i] = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ia64_cpu_to_sapicid[cpu] = -1;
|
||||
cpu_clear(cpu, cpu_present_map);
|
||||
|
||||
@@ -920,7 +904,7 @@ acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *obj;
|
||||
struct acpi_table_iosapic *iosapic;
|
||||
struct acpi_madt_io_sapic *iosapic;
|
||||
unsigned int gsi_base;
|
||||
int pxm, node;
|
||||
|
||||
@@ -938,9 +922,9 @@ acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
iosapic = (struct acpi_table_iosapic *)obj->buffer.pointer;
|
||||
iosapic = (struct acpi_madt_io_sapic *)obj->buffer.pointer;
|
||||
|
||||
if (iosapic->header.type != ACPI_MADT_IOSAPIC) {
|
||||
if (iosapic->header.type != ACPI_MADT_TYPE_IO_SAPIC) {
|
||||
kfree(buffer.pointer);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <asm/sn/sn_sal.h>
|
||||
#include "xtalk/hubdev.h"
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -31,6 +32,12 @@ struct acpi_vendor_uuid sn_uuid = {
|
||||
0xa2, 0x7c, 0x08, 0x00, 0x69, 0x13, 0xea, 0x51 },
|
||||
};
|
||||
|
||||
struct sn_pcidev_match {
|
||||
u8 bus;
|
||||
unsigned int devfn;
|
||||
acpi_handle handle;
|
||||
};
|
||||
|
||||
/*
|
||||
* Perform the early IO init in PROM.
|
||||
*/
|
||||
@@ -119,9 +126,11 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
|
||||
status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,
|
||||
&sn_uuid, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR "get_acpi_pcibus_ptr: "
|
||||
"get_acpi_bussoft_info() failed: %d\n",
|
||||
status);
|
||||
printk(KERN_ERR "%s: "
|
||||
"acpi_get_vendor_resource() failed (0x%x) for: ",
|
||||
__FUNCTION__, status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
return NULL;
|
||||
}
|
||||
resource = buffer.pointer;
|
||||
@@ -130,8 +139,8 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
|
||||
if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) !=
|
||||
sizeof(struct pcibus_bussoft *)) {
|
||||
printk(KERN_ERR
|
||||
"get_acpi_bussoft_ptr: Invalid vendor data "
|
||||
"length %d\n", vendor->byte_length);
|
||||
"%s: Invalid vendor data length %d\n",
|
||||
__FUNCTION__, vendor->byte_length);
|
||||
kfree(buffer.pointer);
|
||||
return NULL;
|
||||
}
|
||||
@@ -143,34 +152,254 @@ sn_get_bussoft_ptr(struct pci_bus *bus)
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_acpi_bus_fixup
|
||||
* sn_extract_device_info - Extract the pcidev_info and the sn_irq_info
|
||||
* pointers from the vendor resource using the
|
||||
* provided acpi handle, and copy the structures
|
||||
* into the argument buffers.
|
||||
*/
|
||||
void
|
||||
sn_acpi_bus_fixup(struct pci_bus *bus)
|
||||
static int
|
||||
sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
|
||||
struct sn_irq_info **sn_irq_info)
|
||||
{
|
||||
struct pci_dev *pci_dev = NULL;
|
||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||
extern void sn_common_bus_fixup(struct pci_bus *,
|
||||
struct pcibus_bussoft *);
|
||||
u64 addr;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct sn_irq_info *irq_info, *irq_info_prom;
|
||||
struct pcidev_info *pcidev_ptr, *pcidev_prom_ptr;
|
||||
struct acpi_resource *resource;
|
||||
int ret = 0;
|
||||
acpi_status status;
|
||||
struct acpi_resource_vendor_typed *vendor;
|
||||
|
||||
if (!bus->parent) { /* If root bus */
|
||||
prom_bussoft_ptr = sn_get_bussoft_ptr(bus);
|
||||
if (prom_bussoft_ptr == NULL) {
|
||||
printk(KERN_ERR
|
||||
"sn_pci_fixup_bus: 0x%04x:0x%02x Unable to "
|
||||
"obtain prom_bussoft_ptr\n",
|
||||
pci_domain_nr(bus), bus->number);
|
||||
return;
|
||||
/*
|
||||
* The pointer to this device's pcidev_info structure in
|
||||
* the PROM, is in the vendor resource.
|
||||
*/
|
||||
status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,
|
||||
&sn_uuid, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR
|
||||
"%s: acpi_get_vendor_resource() failed (0x%x) for: ",
|
||||
__FUNCTION__, status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
resource = buffer.pointer;
|
||||
vendor = &resource->data.vendor_typed;
|
||||
if ((vendor->byte_length - sizeof(struct acpi_vendor_uuid)) !=
|
||||
sizeof(struct pci_devdev_info *)) {
|
||||
printk(KERN_ERR
|
||||
"%s: Invalid vendor data length: %d for: ",
|
||||
__FUNCTION__, vendor->byte_length);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
ret = 1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
pcidev_ptr = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
|
||||
if (!pcidev_ptr)
|
||||
panic("%s: Unable to alloc memory for pcidev_info", __FUNCTION__);
|
||||
|
||||
memcpy(&addr, vendor->byte_data, sizeof(struct pcidev_info *));
|
||||
pcidev_prom_ptr = __va(addr);
|
||||
memcpy(pcidev_ptr, pcidev_prom_ptr, sizeof(struct pcidev_info));
|
||||
|
||||
/* Get the IRQ info */
|
||||
irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
|
||||
if (!irq_info)
|
||||
panic("%s: Unable to alloc memory for sn_irq_info", __FUNCTION__);
|
||||
|
||||
if (pcidev_ptr->pdi_sn_irq_info) {
|
||||
irq_info_prom = __va(pcidev_ptr->pdi_sn_irq_info);
|
||||
memcpy(irq_info, irq_info_prom, sizeof(struct sn_irq_info));
|
||||
}
|
||||
|
||||
*pcidev_info = pcidev_ptr;
|
||||
*sn_irq_info = irq_info;
|
||||
|
||||
exit:
|
||||
kfree(buffer.pointer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
|
||||
{
|
||||
unsigned long adr;
|
||||
acpi_handle child;
|
||||
unsigned int devfn;
|
||||
int function;
|
||||
acpi_handle parent;
|
||||
int slot;
|
||||
acpi_status status;
|
||||
|
||||
/*
|
||||
* Do an upward search to find the root bus device, and
|
||||
* obtain the host devfn from the previous child device.
|
||||
*/
|
||||
child = device_handle;
|
||||
while (child) {
|
||||
status = acpi_get_parent(child, &parent);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR "%s: acpi_get_parent() failed "
|
||||
"(0x%x) for: ", __FUNCTION__, status);
|
||||
acpi_ns_print_node_pathname(child, NULL);
|
||||
printk("\n");
|
||||
panic("%s: Unable to find host devfn\n", __FUNCTION__);
|
||||
}
|
||||
sn_common_bus_fixup(bus, prom_bussoft_ptr);
|
||||
if (parent == rootbus_handle)
|
||||
break;
|
||||
child = parent;
|
||||
}
|
||||
list_for_each_entry(pci_dev, &bus->devices, bus_list) {
|
||||
sn_pci_fixup_slot(pci_dev);
|
||||
if (!child) {
|
||||
printk(KERN_ERR "%s: Unable to find root bus for: ",
|
||||
__FUNCTION__);
|
||||
acpi_ns_print_node_pathname(device_handle, NULL);
|
||||
printk("\n");
|
||||
BUG();
|
||||
}
|
||||
|
||||
status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: ",
|
||||
__FUNCTION__, status);
|
||||
acpi_ns_print_node_pathname(child, NULL);
|
||||
printk("\n");
|
||||
panic("%s: Unable to find host devfn\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
slot = (adr >> 16) & 0xffff;
|
||||
function = adr & 0xffff;
|
||||
devfn = PCI_DEVFN(slot, function);
|
||||
return devfn;
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_acpi_slot_fixup - Perform any SN specific slot fixup.
|
||||
* find_matching_device - Callback routine to find the ACPI device
|
||||
* that matches up with our pci_dev device.
|
||||
* Matching is done on bus number and devfn.
|
||||
* To find the bus number for a particular
|
||||
* ACPI device, we must look at the _BBN method
|
||||
* of its parent.
|
||||
*/
|
||||
static acpi_status
|
||||
find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv)
|
||||
{
|
||||
unsigned long bbn = -1;
|
||||
unsigned long adr;
|
||||
acpi_handle parent = NULL;
|
||||
acpi_status status;
|
||||
unsigned int devfn;
|
||||
int function;
|
||||
int slot;
|
||||
struct sn_pcidev_match *info = context;
|
||||
|
||||
status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
|
||||
&adr);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = acpi_get_parent(handle, &parent);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR
|
||||
"%s: acpi_get_parent() failed (0x%x) for: ",
|
||||
__FUNCTION__, status);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
return AE_OK;
|
||||
}
|
||||
status = acpi_evaluate_integer(parent, METHOD_NAME__BBN,
|
||||
NULL, &bbn);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
printk(KERN_ERR
|
||||
"%s: Failed to find _BBN in parent of: ",
|
||||
__FUNCTION__);
|
||||
acpi_ns_print_node_pathname(handle, NULL);
|
||||
printk("\n");
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
slot = (adr >> 16) & 0xffff;
|
||||
function = adr & 0xffff;
|
||||
devfn = PCI_DEVFN(slot, function);
|
||||
if ((info->devfn == devfn) && (info->bus == bbn)) {
|
||||
/* We have a match! */
|
||||
info->handle = handle;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_acpi_get_pcidev_info - Search ACPI namespace for the acpi
|
||||
* device matching the specified pci_dev,
|
||||
* and return the pcidev info and irq info.
|
||||
*/
|
||||
int
|
||||
sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
|
||||
struct sn_irq_info **sn_irq_info)
|
||||
{
|
||||
unsigned int host_devfn;
|
||||
struct sn_pcidev_match pcidev_match;
|
||||
acpi_handle rootbus_handle;
|
||||
unsigned long segment;
|
||||
acpi_status status;
|
||||
|
||||
rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle;
|
||||
status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL,
|
||||
&segment);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (segment != pci_domain_nr(dev)) {
|
||||
printk(KERN_ERR
|
||||
"%s: Segment number mismatch, 0x%lx vs 0x%x for: ",
|
||||
__FUNCTION__, segment, pci_domain_nr(dev));
|
||||
acpi_ns_print_node_pathname(rootbus_handle, NULL);
|
||||
printk("\n");
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
printk(KERN_ERR "%s: Unable to get __SEG from: ",
|
||||
__FUNCTION__);
|
||||
acpi_ns_print_node_pathname(rootbus_handle, NULL);
|
||||
printk("\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* We want to search all devices in this segment/domain
|
||||
* of the ACPI namespace for the matching ACPI device,
|
||||
* which holds the pcidev_info pointer in its vendor resource.
|
||||
*/
|
||||
pcidev_match.bus = dev->bus->number;
|
||||
pcidev_match.devfn = dev->devfn;
|
||||
pcidev_match.handle = NULL;
|
||||
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, rootbus_handle, ACPI_UINT32_MAX,
|
||||
find_matching_device, &pcidev_match, NULL);
|
||||
|
||||
if (!pcidev_match.handle) {
|
||||
printk(KERN_ERR
|
||||
"%s: Could not find matching ACPI device for %s.\n",
|
||||
__FUNCTION__, pci_name(dev));
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (sn_extract_device_info(pcidev_match.handle, pcidev_info, sn_irq_info))
|
||||
return 1;
|
||||
|
||||
/* Build up the pcidev_info.pdi_slot_host_handle */
|
||||
host_devfn = get_host_devfn(pcidev_match.handle, rootbus_handle);
|
||||
(*pcidev_info)->pdi_slot_host_handle =
|
||||
((unsigned long) pci_domain_nr(dev) << 40) |
|
||||
/* bus == 0 */
|
||||
host_devfn;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_acpi_slot_fixup - Obtain the pcidev_info and sn_irq_info.
|
||||
* Perform any SN specific slot fixup.
|
||||
* At present there does not appear to be
|
||||
* any generic way to handle a ROM image
|
||||
* that has been shadowed by the PROM, so
|
||||
@@ -179,11 +408,18 @@ sn_acpi_bus_fixup(struct pci_bus *bus)
|
||||
*/
|
||||
|
||||
void
|
||||
sn_acpi_slot_fixup(struct pci_dev *dev, struct pcidev_info *pcidev_info)
|
||||
sn_acpi_slot_fixup(struct pci_dev *dev)
|
||||
{
|
||||
void __iomem *addr;
|
||||
struct pcidev_info *pcidev_info = NULL;
|
||||
struct sn_irq_info *sn_irq_info = NULL;
|
||||
size_t size;
|
||||
|
||||
if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) {
|
||||
panic("%s: Failure obtaining pcidev_info for %s\n",
|
||||
__FUNCTION__, pci_name(dev));
|
||||
}
|
||||
|
||||
if (pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE]) {
|
||||
/*
|
||||
* A valid ROM image exists and has been shadowed by the
|
||||
@@ -200,8 +436,11 @@ sn_acpi_slot_fixup(struct pci_dev *dev, struct pcidev_info *pcidev_info)
|
||||
(unsigned long) addr + size;
|
||||
dev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_BIOS_COPY;
|
||||
}
|
||||
sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(sn_acpi_slot_fixup);
|
||||
|
||||
static struct acpi_driver acpi_sn_hubdev_driver = {
|
||||
.name = "SGI HUBDEV Driver",
|
||||
.ids = "SGIHUB,SGITIO",
|
||||
@@ -211,6 +450,33 @@ static struct acpi_driver acpi_sn_hubdev_driver = {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* sn_acpi_bus_fixup - Perform SN specific setup of software structs
|
||||
* (pcibus_bussoft, pcidev_info) and hardware
|
||||
* registers, for the specified bus and devices under it.
|
||||
*/
|
||||
void
|
||||
sn_acpi_bus_fixup(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *pci_dev = NULL;
|
||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||
|
||||
if (!bus->parent) { /* If root bus */
|
||||
prom_bussoft_ptr = sn_get_bussoft_ptr(bus);
|
||||
if (prom_bussoft_ptr == NULL) {
|
||||
printk(KERN_ERR
|
||||
"%s: 0x%04x:0x%02x Unable to "
|
||||
"obtain prom_bussoft_ptr\n",
|
||||
__FUNCTION__, pci_domain_nr(bus), bus->number);
|
||||
return;
|
||||
}
|
||||
sn_common_bus_fixup(bus, prom_bussoft_ptr);
|
||||
}
|
||||
list_for_each_entry(pci_dev, &bus->devices, bus_list) {
|
||||
sn_acpi_slot_fixup(pci_dev);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_io_acpi_init - PROM has ACPI support for IO, defining at a minimum the
|
||||
* nodes and root buses in the DSDT. As a result, bus scanning
|
||||
|
||||
@@ -26,14 +26,10 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <asm/sn/sn2/sn_hwperf.h>
|
||||
#include <asm/sn/acpi.h>
|
||||
#include "acpi/acglobal.h"
|
||||
|
||||
extern void sn_init_cpei_timer(void);
|
||||
extern void register_sn_procfs(void);
|
||||
extern void sn_acpi_bus_fixup(struct pci_bus *);
|
||||
extern void sn_bus_fixup(struct pci_bus *);
|
||||
extern void sn_acpi_slot_fixup(struct pci_dev *, struct pcidev_info *);
|
||||
extern void sn_more_slot_fixup(struct pci_dev *, struct pcidev_info *);
|
||||
extern void sn_legacy_pci_window_fixup(struct pci_controller *, u64, u64);
|
||||
extern void sn_io_acpi_init(void);
|
||||
extern void sn_io_init(void);
|
||||
|
||||
@@ -48,6 +44,9 @@ struct sysdata_el {
|
||||
|
||||
int sn_ioif_inited; /* SN I/O infrastructure initialized? */
|
||||
|
||||
int sn_acpi_rev; /* SN ACPI revision */
|
||||
EXPORT_SYMBOL_GPL(sn_acpi_rev);
|
||||
|
||||
struct sn_pcibus_provider *sn_pci_provider[PCIIO_ASIC_MAX_TYPES]; /* indexed by asic type */
|
||||
|
||||
/*
|
||||
@@ -98,25 +97,6 @@ sal_get_device_dmaflush_list(u64 nasid, u64 widget_num, u64 device_num,
|
||||
return ret_stuff.status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve the pci device information given the bus and device|function number.
|
||||
*/
|
||||
static inline u64
|
||||
sal_get_pcidev_info(u64 segment, u64 bus_number, u64 devfn, u64 pci_dev,
|
||||
u64 sn_irq_info)
|
||||
{
|
||||
struct ia64_sal_retval ret_stuff;
|
||||
ret_stuff.status = 0;
|
||||
ret_stuff.v0 = 0;
|
||||
|
||||
SAL_CALL_NOLOCK(ret_stuff,
|
||||
(u64) SN_SAL_IOIF_GET_PCIDEV_INFO,
|
||||
(u64) segment, (u64) bus_number, (u64) devfn,
|
||||
(u64) pci_dev,
|
||||
sn_irq_info, 0, 0);
|
||||
return ret_stuff.v0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_pcidev_info_get() - Retrieve the pcidev_info struct for the specified
|
||||
* device.
|
||||
@@ -249,50 +229,25 @@ void sn_pci_unfixup_slot(struct pci_dev *dev)
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_pci_fixup_slot() - This routine sets up a slot's resources consistent
|
||||
* with the Linux PCI abstraction layer. Resources
|
||||
* acquired from our PCI provider include PIO maps
|
||||
* to BAR space and interrupt objects.
|
||||
* sn_pci_fixup_slot()
|
||||
*/
|
||||
void sn_pci_fixup_slot(struct pci_dev *dev)
|
||||
void sn_pci_fixup_slot(struct pci_dev *dev, struct pcidev_info *pcidev_info,
|
||||
struct sn_irq_info *sn_irq_info)
|
||||
{
|
||||
int segment = pci_domain_nr(dev->bus);
|
||||
int status = 0;
|
||||
struct pcibus_bussoft *bs;
|
||||
struct pci_bus *host_pci_bus;
|
||||
struct pci_dev *host_pci_dev;
|
||||
struct pcidev_info *pcidev_info;
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
unsigned int bus_no, devfn;
|
||||
struct pci_bus *host_pci_bus;
|
||||
struct pci_dev *host_pci_dev;
|
||||
unsigned int bus_no, devfn;
|
||||
|
||||
pci_dev_get(dev); /* for the sysdata pointer */
|
||||
pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
|
||||
if (!pcidev_info)
|
||||
BUG(); /* Cannot afford to run out of memory */
|
||||
|
||||
sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
|
||||
if (!sn_irq_info)
|
||||
BUG(); /* Cannot afford to run out of memory */
|
||||
|
||||
/* Call to retrieve pci device information needed by kernel. */
|
||||
status = sal_get_pcidev_info((u64) segment, (u64) dev->bus->number,
|
||||
dev->devfn,
|
||||
(u64) __pa(pcidev_info),
|
||||
(u64) __pa(sn_irq_info));
|
||||
if (status)
|
||||
BUG(); /* Cannot get platform pci device information */
|
||||
|
||||
/* Add pcidev_info to list in pci_controller.platform_data */
|
||||
list_add_tail(&pcidev_info->pdi_list,
|
||||
&(SN_PLATFORM_DATA(dev->bus)->pcidev_info));
|
||||
|
||||
if (SN_ACPI_BASE_SUPPORT())
|
||||
sn_acpi_slot_fixup(dev, pcidev_info);
|
||||
else
|
||||
sn_more_slot_fixup(dev, pcidev_info);
|
||||
/*
|
||||
* Using the PROMs values for the PCI host bus, get the Linux
|
||||
* PCI host_pci_dev struct and set up host bus linkages
|
||||
* PCI host_pci_dev struct and set up host bus linkages
|
||||
*/
|
||||
|
||||
bus_no = (pcidev_info->pdi_slot_host_handle >> 32) & 0xff;
|
||||
@@ -489,11 +444,6 @@ void sn_generate_path(struct pci_bus *pci_bus, char *address)
|
||||
sprintf(address, "%s^%d", address, geo_slot(geoid));
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_pci_fixup_bus() - Perform SN specific setup of software structs
|
||||
* (pcibus_bussoft, pcidev_info) and hardware
|
||||
* registers, for the specified bus and devices under it.
|
||||
*/
|
||||
void __devinit
|
||||
sn_pci_fixup_bus(struct pci_bus *bus)
|
||||
{
|
||||
@@ -519,6 +469,15 @@ sn_io_early_init(void)
|
||||
if (!ia64_platform_is("sn2") || IS_RUNNING_ON_FAKE_PROM())
|
||||
return 0;
|
||||
|
||||
/* we set the acpi revision to that of the DSDT table OEM rev. */
|
||||
{
|
||||
struct acpi_table_header *header = NULL;
|
||||
|
||||
acpi_get_table_by_index(ACPI_TABLE_INDEX_DSDT, &header);
|
||||
BUG_ON(header == NULL);
|
||||
sn_acpi_rev = header->oem_revision;
|
||||
}
|
||||
|
||||
/*
|
||||
* prime sn_pci_provider[]. Individial provider init routines will
|
||||
* override their respective default entries.
|
||||
@@ -544,8 +503,12 @@ sn_io_early_init(void)
|
||||
register_sn_procfs();
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO "ACPI DSDT OEM Rev 0x%x\n",
|
||||
acpi_gbl_DSDT->oem_revision);
|
||||
{
|
||||
struct acpi_table_header *header;
|
||||
(void)acpi_get_table_by_index(ACPI_TABLE_INDEX_DSDT, &header);
|
||||
printk(KERN_INFO "ACPI DSDT OEM Rev 0x%x\n",
|
||||
header->oem_revision);
|
||||
}
|
||||
if (SN_ACPI_BASE_SUPPORT())
|
||||
sn_io_acpi_init();
|
||||
else
|
||||
@@ -605,7 +568,6 @@ sn_io_late_init(void)
|
||||
|
||||
fs_initcall(sn_io_late_init);
|
||||
|
||||
EXPORT_SYMBOL(sn_pci_fixup_slot);
|
||||
EXPORT_SYMBOL(sn_pci_unfixup_slot);
|
||||
EXPORT_SYMBOL(sn_bus_store_sysdata);
|
||||
EXPORT_SYMBOL(sn_bus_free_sysdata);
|
||||
|
||||
@@ -56,6 +56,25 @@ static inline u64 sal_get_pcibus_info(u64 segment, u64 busnum, u64 address)
|
||||
return ret_stuff.v0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve the pci device information given the bus and device|function number.
|
||||
*/
|
||||
static inline u64
|
||||
sal_get_pcidev_info(u64 segment, u64 bus_number, u64 devfn, u64 pci_dev,
|
||||
u64 sn_irq_info)
|
||||
{
|
||||
struct ia64_sal_retval ret_stuff;
|
||||
ret_stuff.status = 0;
|
||||
ret_stuff.v0 = 0;
|
||||
|
||||
SAL_CALL_NOLOCK(ret_stuff,
|
||||
(u64) SN_SAL_IOIF_GET_PCIDEV_INFO,
|
||||
(u64) segment, (u64) bus_number, (u64) devfn,
|
||||
(u64) pci_dev,
|
||||
sn_irq_info, 0, 0);
|
||||
return ret_stuff.v0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sn_fixup_ionodes() - This routine initializes the HUB data structure for
|
||||
@@ -172,18 +191,40 @@ sn_pci_window_fixup(struct pci_dev *dev, unsigned int count,
|
||||
}
|
||||
|
||||
/*
|
||||
* sn_more_slot_fixup() - We are not running with an ACPI capable PROM,
|
||||
* sn_io_slot_fixup() - We are not running with an ACPI capable PROM,
|
||||
* and need to convert the pci_dev->resource
|
||||
* 'start' and 'end' addresses to mapped addresses,
|
||||
* and setup the pci_controller->window array entries.
|
||||
*/
|
||||
void
|
||||
sn_more_slot_fixup(struct pci_dev *dev, struct pcidev_info *pcidev_info)
|
||||
sn_io_slot_fixup(struct pci_dev *dev)
|
||||
{
|
||||
unsigned int count = 0;
|
||||
int idx;
|
||||
s64 pci_addrs[PCI_ROM_RESOURCE + 1];
|
||||
unsigned long addr, end, size, start;
|
||||
struct pcidev_info *pcidev_info;
|
||||
struct sn_irq_info *sn_irq_info;
|
||||
int status;
|
||||
|
||||
pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
|
||||
if (!pcidev_info)
|
||||
panic("%s: Unable to alloc memory for pcidev_info", __FUNCTION__);
|
||||
|
||||
sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
|
||||
if (!sn_irq_info)
|
||||
panic("%s: Unable to alloc memory for sn_irq_info", __FUNCTION__);
|
||||
|
||||
/* Call to retrieve pci device information needed by kernel. */
|
||||
status = sal_get_pcidev_info((u64) pci_domain_nr(dev),
|
||||
(u64) dev->bus->number,
|
||||
dev->devfn,
|
||||
(u64) __pa(pcidev_info),
|
||||
(u64) __pa(sn_irq_info));
|
||||
|
||||
if (status)
|
||||
BUG(); /* Cannot get platform pci device information */
|
||||
|
||||
|
||||
/* Copy over PIO Mapped Addresses */
|
||||
for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) {
|
||||
@@ -219,8 +260,12 @@ sn_more_slot_fixup(struct pci_dev *dev, struct pcidev_info *pcidev_info)
|
||||
*/
|
||||
if (count > 0)
|
||||
sn_pci_window_fixup(dev, count, pci_addrs);
|
||||
|
||||
sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(sn_io_slot_fixup);
|
||||
|
||||
/*
|
||||
* sn_pci_controller_fixup() - This routine sets up a bus's resources
|
||||
* consistent with the Linux PCI abstraction layer.
|
||||
@@ -272,9 +317,6 @@ sn_bus_fixup(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *pci_dev = NULL;
|
||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||
extern void sn_common_bus_fixup(struct pci_bus *,
|
||||
struct pcibus_bussoft *);
|
||||
|
||||
|
||||
if (!bus->parent) { /* If root bus */
|
||||
prom_bussoft_ptr = PCI_CONTROLLER(bus)->platform_data;
|
||||
@@ -291,7 +333,7 @@ sn_bus_fixup(struct pci_bus *bus)
|
||||
prom_bussoft_ptr->bs_legacy_mem);
|
||||
}
|
||||
list_for_each_entry(pci_dev, &bus->devices, bus_list) {
|
||||
sn_pci_fixup_slot(pci_dev);
|
||||
sn_io_slot_fixup(pci_dev);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
@@ -26,9 +26,10 @@
|
||||
* @port: port to convert
|
||||
*
|
||||
* Legacy in/out instructions are converted to ld/st instructions
|
||||
* on IA64. This routine will convert a port number into a valid
|
||||
* on IA64. This routine will convert a port number into a valid
|
||||
* SN i/o address. Used by sn_in*() and sn_out*().
|
||||
*/
|
||||
|
||||
void *sn_io_addr(unsigned long port)
|
||||
{
|
||||
if (!IS_RUNNING_ON_SIMULATOR()) {
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
#include "xtalk/hubdev.h"
|
||||
|
||||
int
|
||||
sal_pcibr_slot_enable(struct pcibus_info *soft, int device, void *resp)
|
||||
sal_pcibr_slot_enable(struct pcibus_info *soft, int device, void *resp,
|
||||
char **ssdt)
|
||||
{
|
||||
struct ia64_sal_retval ret_stuff;
|
||||
u64 busnum;
|
||||
@@ -32,7 +33,8 @@ sal_pcibr_slot_enable(struct pcibus_info *soft, int device, void *resp)
|
||||
segment = soft->pbi_buscommon.bs_persist_segment;
|
||||
busnum = soft->pbi_buscommon.bs_persist_busnum;
|
||||
SAL_CALL_NOLOCK(ret_stuff, (u64) SN_SAL_IOIF_SLOT_ENABLE, segment,
|
||||
busnum, (u64) device, (u64) resp, 0, 0, 0);
|
||||
busnum, (u64) device, (u64) resp, (u64)ia64_tpa(ssdt),
|
||||
0, 0);
|
||||
|
||||
return (int)ret_stuff.v0;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ static void via_bugs(void)
|
||||
|
||||
static int nvidia_hpet_detected __initdata;
|
||||
|
||||
static int __init nvidia_hpet_check(unsigned long phys, unsigned long size)
|
||||
static int __init nvidia_hpet_check(struct acpi_table_header *header)
|
||||
{
|
||||
nvidia_hpet_detected = 1;
|
||||
return 0;
|
||||
@@ -53,7 +53,7 @@ static void nvidia_bugs(void)
|
||||
return;
|
||||
|
||||
nvidia_hpet_detected = 0;
|
||||
acpi_table_parse(ACPI_HPET, nvidia_hpet_check);
|
||||
acpi_table_parse(ACPI_SIG_HPET, nvidia_hpet_check);
|
||||
if (nvidia_hpet_detected == 0) {
|
||||
acpi_skip_timer_override = 1;
|
||||
printk(KERN_INFO "Nvidia board "
|
||||
|
||||
@@ -58,8 +58,8 @@ void __init clustered_apic_check(void)
|
||||
* Some x86_64 machines use physical APIC mode regardless of how many
|
||||
* procs/clusters are present (x86_64 ES7000 is an example).
|
||||
*/
|
||||
if (acpi_fadt.revision > FADT2_REVISION_ID)
|
||||
if (acpi_fadt.force_apic_physical_destination_mode) {
|
||||
if (acpi_gbl_FADT.header.revision > FADT2_REVISION_ID)
|
||||
if (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) {
|
||||
genapic = &apic_cluster;
|
||||
goto print;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user