Commit 1963fd3f authored by David Mosberger's avatar David Mosberger

Merge tiger.hpl.hp.com:/data1/bk/vanilla/linux-2.5

into tiger.hpl.hp.com:/data1/bk/lia64/to-linus-2.5
parents d3fdc9ac 6737083d
......@@ -38,24 +38,6 @@ config EFI
bool
default y
choice
prompt "Processor type"
default ITANIUM
config ITANIUM
bool "Itanium"
help
Select your IA-64 processor type. The default is Itanium.
This choice is safe for all IA-64 systems, but may not perform
optimally on systems with, say, Itanium 2 or newer processors.
config MCKINLEY
bool "Itanium 2"
help
Select this to configure for an Itanium 2 (McKinley) processor.
endchoice
choice
prompt "System type"
default IA64_GENERIC
......@@ -96,6 +78,24 @@ config IA64_HP_SIM
endchoice
choice
prompt "Processor type"
default ITANIUM
config ITANIUM
bool "Itanium"
help
Select your IA-64 processor type. The default is Itanium.
This choice is safe for all IA-64 systems, but may not perform
optimally on systems with, say, Itanium 2 or newer processors.
config MCKINLEY
bool "Itanium 2"
help
Select this to configure for an Itanium 2 (McKinley) processor.
endchoice
choice
prompt "Kernel page size"
default IA64_PAGE_SIZE_16KB
......@@ -129,52 +129,6 @@ config IA64_PAGE_SIZE_64KB
endchoice
config ACPI
bool
depends on !IA64_HP_SIM
default y
help
ACPI/OSPM support for Linux is currently under development. As such,
this support is preliminary and EXPERIMENTAL. Configuring ACPI
support enables kernel interfaces that allow higher level software
(OSPM) to manipulate ACPI defined hardware and software interfaces,
including the evaluation of ACPI control methods. If unsure, choose
N here. Note, this option will enlarge your kernel by about 120K.
This support requires an ACPI compliant platform (hardware/firmware).
If both ACPI and Advanced Power Management (APM) support are
configured, whichever is loaded first shall be used.
This code DOES NOT currently provide a complete OSPM implementation
-- it has not yet reached APM's level of functionality. When fully
implemented, Linux ACPI/OSPM will provide a more robust functional
replacement for legacy configuration and power management
interfaces, including the Plug-and-Play BIOS specification (PnP
BIOS), the Multi-Processor Specification (MPS), and the Advanced
Power Management specification (APM).
Linux support for ACPI/OSPM is based on Intel Corporation's ACPI
Component Architecture (ACPI CA). The latest ACPI CA source code,
documentation, debug builds, and implementation status information
can be downloaded from:
<http://developer.intel.com/technology/iapc/acpi/downloads.htm>.
The ACPI Sourceforge project may also be of interest:
<http://sf.net/projects/acpi/>
config ACPI_INTERPRETER
bool
depends on !IA64_HP_SIM
default y
config ACPI_KERNEL_CONFIG
bool
depends on !IA64_HP_SIM
default y
help
If you say `Y' here, Linux's ACPI support will use the
hardware-level system descriptions found on IA-64 systems.
config IA64_BRL_EMU
bool
depends on ITANIUM
......@@ -238,40 +192,12 @@ config DISCONTIGMEM
or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more.
config IA64_MCA
bool "Machine Check Abort"
default y if !IA64_HP_SIM
help
Say Y here to enable machine check support for IA-64. If you're
unsure, answer Y.
config IA64_CYCLONE
bool "Support Cyclone(EXA) Time Source"
help
Say Y here to enable support for IBM EXA Cyclone time source.
If you're unsure, answer N.
config PM
bool "Power Management support"
depends on IA64_GENERIC || IA64_DIG || IA64_HP_ZX1
default y
help
"Power Management" means that parts of your computer are shut
off or put into a power conserving "sleep" mode if they are not
being used. There are two competing standards for doing this: APM
and ACPI. If you want to use either one, say Y here and then also
to the requisite support below.
Power Management is most important for battery powered laptop
computers; if you have a laptop, check out the Linux Laptop home
page on the WWW at <http://www.linux-on-laptops.com/> and the
Battery Powered Linux mini-HOWTO, available from
<http://www.tldp.org/docs.html#howto>.
Note that, even if you say N here, Linux on the x86 architecture
will issue the hlt instruction if nothing is to be done, thereby
sending the processor to sleep and saving power.
config IOSAPIC
bool
depends on !IA64_HP_SIM
......@@ -389,10 +315,89 @@ config EFI_VARS
source "fs/Kconfig.binfmt"
endmenu
menu "Power management and ACPI"
config PM
bool "Power Management support"
depends on IA64_GENERIC || IA64_DIG || IA64_HP_ZX1
default y
help
"Power Management" means that parts of your computer are shut
off or put into a power conserving "sleep" mode if they are not
being used. There are two competing standards for doing this: APM
and ACPI. If you want to use either one, say Y here and then also
to the requisite support below.
Power Management is most important for battery powered laptop
computers; if you have a laptop, check out the Linux Laptop home
page on the WWW at <http://www.linux-on-laptops.com/> and the
Battery Powered Linux mini-HOWTO, available from
<http://www.tldp.org/docs.html#howto>.
Note that, even if you say N here, Linux on the x86 architecture
will issue the hlt instruction if nothing is to be done, thereby
sending the processor to sleep and saving power.
config ACPI
bool
depends on !IA64_HP_SIM
default y
help
ACPI/OSPM support for Linux is currently under development. As such,
this support is preliminary and EXPERIMENTAL. Configuring ACPI
support enables kernel interfaces that allow higher level software
(OSPM) to manipulate ACPI defined hardware and software interfaces,
including the evaluation of ACPI control methods. If unsure, choose
N here. Note, this option will enlarge your kernel by about 120K.
This support requires an ACPI compliant platform (hardware/firmware).
If both ACPI and Advanced Power Management (APM) support are
configured, whichever is loaded first shall be used.
This code DOES NOT currently provide a complete OSPM implementation
-- it has not yet reached APM's level of functionality. When fully
implemented, Linux ACPI/OSPM will provide a more robust functional
replacement for legacy configuration and power management
interfaces, including the Plug-and-Play BIOS specification (PnP
BIOS), the Multi-Processor Specification (MPS), and the Advanced
Power Management specification (APM).
Linux support for ACPI/OSPM is based on Intel Corporation's ACPI
Component Architecture (ACPI CA). The latest ACPI CA source code,
documentation, debug builds, and implementation status information
can be downloaded from:
<http://developer.intel.com/technology/iapc/acpi/downloads.htm>.
The ACPI Sourceforge project may also be of interest:
<http://sf.net/projects/acpi/>
config ACPI_INTERPRETER
bool
depends on !IA64_HP_SIM
default y
config ACPI_KERNEL_CONFIG
bool
depends on !IA64_HP_SIM
default y
help
If you say `Y' here, Linux's ACPI support will use the
hardware-level system descriptions found on IA-64 systems.
if !IA64_HP_SIM
source "drivers/acpi/Kconfig"
endif
endmenu
if !IA64_HP_SIM
menu "Bus options (PCI, PCMCIA)"
config PCI
bool "PCI support"
help
......@@ -416,10 +421,10 @@ source "drivers/pci/hotplug/Kconfig"
source "drivers/pcmcia/Kconfig"
endif
endmenu
endif
source "drivers/Kconfig"
source "fs/Kconfig"
......
This diff is collapsed.
......@@ -1055,13 +1055,13 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, int
*dma_handle = virt_to_phys(addr);
#ifdef ALLOW_IOV_BYPASS
ASSERT(to_pci_dev(dev)->consistent_dma_mask);
ASSERT(dev->coherent_dma_mask);
/*
** Check if the PCI device can DMA to ptr... if so, just return ptr
*/
if (likely((*dma_handle & ~to_pci_dev(dev)->consistent_dma_mask) == 0)) {
if (likely((*dma_handle & ~dev->coherent_dma_mask) == 0)) {
DBG_BYPASS("sba_alloc_coherent() bypass mask/addr: 0x%lx/0x%lx\n",
to_pci_dev(dev)->consistent_dma_mask, *dma_handle);
dev->coherent_dma_mask, *dma_handle);
return addr;
}
......
......@@ -6,13 +6,12 @@ extra-y := head.o init_task.o vmlinux.lds.s
obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \
salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o unwind.o
salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o unwind.o mca.o mca_asm.o
obj-$(CONFIG_EFI_VARS) += efivars.o
obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o
obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o
obj-$(CONFIG_IA64_HP_ZX1) += acpi-ext.o
obj-$(CONFIG_IA64_MCA) += mca.o mca_asm.o
obj-$(CONFIG_IA64_PALINFO) += palinfo.o
obj-$(CONFIG_IOSAPIC) += iosapic.o
obj-$(CONFIG_MODULES) += module.o
......
......@@ -626,6 +626,7 @@ acpi_boot_init (void)
return 0;
}
/* deprecated in favor of acpi_gsi_to_irq */
int
acpi_irq_to_vector (u32 gsi)
{
......@@ -635,6 +636,23 @@ acpi_irq_to_vector (u32 gsi)
return gsi_to_vector(gsi);
}
int
acpi_gsi_to_irq (u32 gsi, unsigned int *irq)
{
int vector;
if (has_8259 && gsi < 16)
*irq = isa_irq_to_vector(gsi);
else {
vector = gsi_to_vector(gsi);
if (vector == -1)
return -1;
*irq = vector;
}
return 0;
}
int
acpi_register_irq (u32 gsi, u32 polarity, u32 trigger)
{
......
......@@ -399,9 +399,7 @@ efi_map_pal_code (void)
int pal_code_count = 0;
u64 mask, psr;
u64 vaddr;
#ifdef CONFIG_IA64_MCA
int cpu;
#endif
efi_map_start = __va(ia64_boot_param->efi_memmap);
efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
......@@ -463,13 +461,11 @@ efi_map_pal_code (void)
ia64_set_psr(psr); /* restore psr */
ia64_srlz_i();
#ifdef CONFIG_IA64_MCA
cpu = smp_processor_id();
/* insert this TR into our list for MCA recovery purposes */
ia64_mca_tlb_list[cpu].pal_base = vaddr & mask;
ia64_mca_tlb_list[cpu].pal_paddr = pte_val(mk_pte_phys(md->phys_addr, PAGE_KERNEL));
#endif
}
}
......
......@@ -355,10 +355,8 @@ setup_arch (char **cmdline_p)
# endif
#endif
#ifdef CONFIG_IA64_MCA
/* enable IA-64 Machine Check Abort Handling */
ia64_mca_init();
#endif
platform_setup(cmdline_p);
paging_init();
......
......@@ -300,9 +300,7 @@ smp_callin (void)
*/
ia64_set_kr(IA64_KR_IO_BASE, __pa(ia64_iobase));
#ifdef CONFIG_IA64_MCA
ia64_mca_cmc_vector_setup(); /* Setup vector on AP & enable */
#endif
#ifdef CONFIG_PERFMON
pfm_init_percpu();
......
......@@ -46,6 +46,8 @@ show_mem (void)
printk("Free swap: %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
i = max_mapnr;
while (i-- > 0) {
if (!pfn_valid(i))
continue;
total++;
if (PageReserved(mem_map+i))
reserved++;
......
......@@ -499,6 +499,8 @@ void show_mem(void)
for_each_pgdat(pgdat) {
printk("Node ID: %d\n", pgdat->node_id);
for(i = 0; i < pgdat->node_spanned_pages; i++) {
if (!ia64_pfn_valid(pgdat->node_start_pfn+i))
continue;
if (PageReserved(pgdat->node_mem_map+i))
reserved++;
else if (PageSwapCache(pgdat->node_mem_map+i))
......
......@@ -279,9 +279,7 @@ ia64_mmu_init (void *my_cpu_data)
{
unsigned long psr, pta, impl_va_bits;
extern void __init tlb_init (void);
#ifdef CONFIG_IA64_MCA
int cpu;
#endif
#ifdef CONFIG_DISABLE_VHPT
# define VHPT_ENABLE_BIT 0
......@@ -346,7 +344,6 @@ ia64_mmu_init (void *my_cpu_data)
ia64_set_rr(HPAGE_REGION_BASE, HPAGE_SHIFT << 2);
#endif
#ifdef CONFIG_IA64_MCA
cpu = smp_processor_id();
/* mca handler uses cr.lid as key to pick the right entry */
......@@ -360,7 +357,6 @@ ia64_mmu_init (void *my_cpu_data)
ia64_mca_tlb_list[cpu].ptce_count[1] = local_cpu_data->ptce_count[1];
ia64_mca_tlb_list[cpu].ptce_stride[0] = local_cpu_data->ptce_stride[0];
ia64_mca_tlb_list[cpu].ptce_stride[1] = local_cpu_data->ptce_stride[1];
#endif
}
#ifdef CONFIG_VIRTUAL_MEM_MAP
......@@ -459,8 +455,11 @@ int
ia64_pfn_valid (unsigned long pfn)
{
char byte;
struct page *pg = pfn_to_page(pfn);
return __get_user(byte, (char *) pfn_to_page(pfn)) == 0;
return (__get_user(byte, (char *) pg) == 0)
&& ((((u64)pg & PAGE_MASK) == (((u64)(pg + 1) - 1) & PAGE_MASK))
|| (__get_user(byte, (char *) (pg + 1) - 1) == 0));
}
EXPORT_SYMBOL(ia64_pfn_valid);
......
......@@ -194,10 +194,7 @@ early_sn_setup(void)
}
}
#ifdef CONFIG_IA64_MCA
extern int platform_intr_list[];
#endif
extern nasid_t master_nasid;
static int shub_1_1_found __initdata;
......
......@@ -27,10 +27,6 @@
#define HP_ZX1_TCNFG 0x318
#define HP_ZX1_PDIR_BASE 0x320
/* HP ZX1 LBA registers */
#define HP_ZX1_AGP_STATUS 0x64
#define HP_ZX1_AGP_COMMAND 0x68
#define HP_ZX1_IOVA_BASE GB(1UL)
#define HP_ZX1_IOVA_SIZE GB(1UL)
#define HP_ZX1_GART_SIZE (HP_ZX1_IOVA_SIZE / 2)
......@@ -39,6 +35,9 @@
#define HP_ZX1_PDIR_VALID_BIT 0x8000000000000000UL
#define HP_ZX1_IOVA_TO_PDIR(va) ((va - hp_private.iova_base) >> hp_private.io_tlb_shift)
#define AGP8X_MODE_BIT 3
#define AGP8X_MODE (1 << AGP8X_MODE_BIT)
/* AGP bridge need not be PCI device, but DRM thinks it is. */
static struct pci_dev fake_bridge_dev;
......@@ -57,6 +56,7 @@ static struct gatt_mask hp_zx1_masks[] =
static struct _hp_private {
volatile u8 *ioc_regs;
volatile u8 *lba_regs;
int lba_cap_offset;
u64 *io_pdir; // PDIR for entire IOVA
u64 *gatt; // PDIR just for GART (subset of above)
u64 gatt_entries;
......@@ -109,6 +109,7 @@ static int __init hp_zx1_ioc_shared(void)
hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)];
if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) {
/* Normal case when no AGP device in system */
hp->gatt = 0;
hp->gatt_entries = 0;
printk(KERN_ERR PFX "No reserved IO PDIR entry found; "
......@@ -156,12 +157,13 @@ hp_zx1_ioc_owner (void)
}
static int __init
hp_zx1_ioc_init (u64 ioc_hpa, u64 lba_hpa)
hp_zx1_ioc_init (u64 hpa)
{
struct _hp_private *hp = &hp_private;
hp->ioc_regs = ioremap(ioc_hpa, 1024);
hp->lba_regs = ioremap(lba_hpa, 256);
hp->ioc_regs = ioremap(hpa, 1024);
if (!hp->ioc_regs)
return -ENOMEM;
/*
* If the IOTLB is currently disabled, we can take it over.
......@@ -175,6 +177,51 @@ hp_zx1_ioc_init (u64 ioc_hpa, u64 lba_hpa)
return hp_zx1_ioc_shared();
}
static int
hp_zx1_lba_find_capability (volatile u8 *hpa, int cap)
{
u16 status;
u8 pos, id;
int ttl = 48;
status = INREG16(hpa, PCI_STATUS);
if (!(status & PCI_STATUS_CAP_LIST))
return 0;
pos = INREG8(hpa, PCI_CAPABILITY_LIST);
while (ttl-- && pos >= 0x40) {
pos &= ~3;
id = INREG8(hpa, pos + PCI_CAP_LIST_ID);
if (id == 0xff)
break;
if (id == cap)
return pos;
pos = INREG8(hpa, pos + PCI_CAP_LIST_NEXT);
}
return 0;
}
static int __init
hp_zx1_lba_init (u64 hpa)
{
struct _hp_private *hp = &hp_private;
int cap;
hp->lba_regs = ioremap(hpa, 256);
if (!hp->lba_regs)
return -ENOMEM;
hp->lba_cap_offset = hp_zx1_lba_find_capability(hp->lba_regs, PCI_CAP_ID_AGP);
cap = INREG32(hp->lba_regs, hp->lba_cap_offset) & 0xff;
if (cap != PCI_CAP_ID_AGP) {
printk(KERN_ERR PFX "Invalid capability ID 0x%02x at 0x%x\n",
cap, hp->lba_cap_offset);
return -ENODEV;
}
return 0;
}
static int
hp_zx1_fetch_size(void)
{
......@@ -192,13 +239,8 @@ hp_zx1_configure (void)
struct _hp_private *hp = &hp_private;
agp_bridge->gart_bus_addr = hp->gart_base;
#if 0
/* ouch!! can't do that with a non-PCI AGP bridge... */
agp_bridge->capndx = pci_find_capability(agp_bridge->dev, PCI_CAP_ID_AGP);
#else
agp_bridge->capndx = 0;
#endif
agp_bridge->mode = INREG32(hp->lba_regs, HP_ZX1_AGP_STATUS);
agp_bridge->capndx = hp->lba_cap_offset;
agp_bridge->mode = INREG32(hp->lba_regs, hp->lba_cap_offset + PCI_AGP_STATUS);
if (hp->io_pdir_owner) {
OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_phys(hp->io_pdir));
......@@ -217,9 +259,13 @@ hp_zx1_cleanup (void)
{
struct _hp_private *hp = &hp_private;
if (hp->ioc_regs) {
if (hp->io_pdir_owner)
OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, 0);
iounmap((void *) hp->ioc_regs);
}
if (hp->lba_regs)
iounmap((void *) hp->lba_regs);
}
static void
......@@ -350,14 +396,14 @@ hp_zx1_enable (u32 mode)
struct _hp_private *hp = &hp_private;
u32 command;
command = INREG32(hp->lba_regs, HP_ZX1_AGP_STATUS);
command = INREG32(hp->lba_regs, hp->lba_cap_offset + PCI_AGP_STATUS);
command = agp_collect_device_status(mode, command);
command |= 0x00000100;
OUTREG32(hp->lba_regs, HP_ZX1_AGP_COMMAND, command);
OUTREG32(hp->lba_regs, hp->lba_cap_offset + PCI_AGP_COMMAND, command);
agp_device_command(command, 0);
agp_device_command(command, (mode & AGP8X_MODE) != 0);
}
struct agp_bridge_driver hp_zx1_driver = {
......@@ -386,22 +432,32 @@ static int __init
hp_zx1_setup (u64 ioc_hpa, u64 lba_hpa)
{
struct agp_bridge_data *bridge;
int error;
int error = 0;
error = hp_zx1_ioc_init(ioc_hpa, lba_hpa);
error = hp_zx1_ioc_init(ioc_hpa);
if (error)
return error;
goto fail;
error = hp_zx1_lba_init(lba_hpa);
if (error)
goto fail;
bridge = agp_alloc_bridge();
if (!bridge)
return -ENOMEM;
if (!bridge) {
error = -ENOMEM;
goto fail;
}
bridge->driver = &hp_zx1_driver;
fake_bridge_dev.vendor = PCI_VENDOR_ID_HP;
fake_bridge_dev.device = PCI_DEVICE_ID_HP_PCIX_LBA;
bridge->dev = &fake_bridge_dev;
return agp_add_bridge(bridge);
error = agp_add_bridge(bridge);
fail:
if (error)
hp_zx1_cleanup();
return error;
}
static acpi_status __init
......@@ -416,7 +472,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
status = hp_acpi_csr_space(obj, &lba_hpa, &length);
if (ACPI_FAILURE(status))
return AE_OK;
return AE_OK; /* keep looking for another bridge */
/* Look for an enclosing IOC scope and find its CSR space */
handle = obj;
......@@ -452,7 +508,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
(char *) context, sba_hpa + HP_ZX1_IOC_OFFSET, lba_hpa);
hp_zx1_gart_found = 1;
return AE_CTRL_TERMINATE;
return AE_CTRL_TERMINATE; /* we only support one bridge; quit looking */
}
static int __init
......
......@@ -977,7 +977,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count)
}
sn_func->sal_puts(s, count);
}
else
else {
/* Output '\r' before each '\n' */
while ((s1 = memchr(s, '\n', count)) != NULL) {
sn_sal_write(NULL, 0, s, s1 - s);
......@@ -986,6 +986,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count)
s = s1 + 1;
}
sn_sal_write(NULL, 0, s, count);
}
}
static struct tty_driver *
......
......@@ -93,7 +93,8 @@ ia64_acpi_release_global_lock (unsigned int *lock)
const char *acpi_get_sysname (void);
int acpi_request_vector (u32 int_type);
int acpi_register_irq (u32 gsi, u32 polarity, u32 trigger);
int acpi_irq_to_vector (u32 irq);
int acpi_irq_to_vector (u32 irq); /* deprecated in favor of acpi_gsi_to_irq */
int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
#ifdef CONFIG_ACPI_NUMA
/* Proximity bitmap length; _PXM is at most 255 (8 bit)*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment