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 ...@@ -38,24 +38,6 @@ config EFI
bool bool
default y 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 choice
prompt "System type" prompt "System type"
default IA64_GENERIC default IA64_GENERIC
...@@ -96,6 +78,24 @@ config IA64_HP_SIM ...@@ -96,6 +78,24 @@ config IA64_HP_SIM
endchoice 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 choice
prompt "Kernel page size" prompt "Kernel page size"
default IA64_PAGE_SIZE_16KB default IA64_PAGE_SIZE_16KB
...@@ -129,52 +129,6 @@ config IA64_PAGE_SIZE_64KB ...@@ -129,52 +129,6 @@ config IA64_PAGE_SIZE_64KB
endchoice 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 config IA64_BRL_EMU
bool bool
depends on ITANIUM depends on ITANIUM
...@@ -238,40 +192,12 @@ config DISCONTIGMEM ...@@ -238,40 +192,12 @@ config DISCONTIGMEM
or have huge holes in the physical address space for other reasons. or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more. 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 config IA64_CYCLONE
bool "Support Cyclone(EXA) Time Source" bool "Support Cyclone(EXA) Time Source"
help help
Say Y here to enable support for IBM EXA Cyclone time source. Say Y here to enable support for IBM EXA Cyclone time source.
If you're unsure, answer N. 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 config IOSAPIC
bool bool
depends on !IA64_HP_SIM depends on !IA64_HP_SIM
...@@ -389,10 +315,89 @@ config EFI_VARS ...@@ -389,10 +315,89 @@ config EFI_VARS
source "fs/Kconfig.binfmt" 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 if !IA64_HP_SIM
source "drivers/acpi/Kconfig" source "drivers/acpi/Kconfig"
endif
endmenu
if !IA64_HP_SIM
menu "Bus options (PCI, PCMCIA)"
config PCI config PCI
bool "PCI support" bool "PCI support"
help help
...@@ -416,10 +421,10 @@ source "drivers/pci/hotplug/Kconfig" ...@@ -416,10 +421,10 @@ source "drivers/pci/hotplug/Kconfig"
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
endif
endmenu endmenu
endif
source "drivers/Kconfig" source "drivers/Kconfig"
source "fs/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 ...@@ -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); *dma_handle = virt_to_phys(addr);
#ifdef ALLOW_IOV_BYPASS #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 ** 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", 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; return addr;
} }
......
...@@ -6,13 +6,12 @@ extra-y := head.o init_task.o vmlinux.lds.s ...@@ -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 \ 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 \ 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_EFI_VARS) += efivars.o
obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o
obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o
obj-$(CONFIG_IA64_HP_ZX1) += 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_IA64_PALINFO) += palinfo.o
obj-$(CONFIG_IOSAPIC) += iosapic.o obj-$(CONFIG_IOSAPIC) += iosapic.o
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o
......
...@@ -626,6 +626,7 @@ acpi_boot_init (void) ...@@ -626,6 +626,7 @@ acpi_boot_init (void)
return 0; return 0;
} }
/* deprecated in favor of acpi_gsi_to_irq */
int int
acpi_irq_to_vector (u32 gsi) acpi_irq_to_vector (u32 gsi)
{ {
...@@ -635,6 +636,23 @@ acpi_irq_to_vector (u32 gsi) ...@@ -635,6 +636,23 @@ acpi_irq_to_vector (u32 gsi)
return gsi_to_vector(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 int
acpi_register_irq (u32 gsi, u32 polarity, u32 trigger) acpi_register_irq (u32 gsi, u32 polarity, u32 trigger)
{ {
......
...@@ -399,9 +399,7 @@ efi_map_pal_code (void) ...@@ -399,9 +399,7 @@ efi_map_pal_code (void)
int pal_code_count = 0; int pal_code_count = 0;
u64 mask, psr; u64 mask, psr;
u64 vaddr; u64 vaddr;
#ifdef CONFIG_IA64_MCA
int cpu; int cpu;
#endif
efi_map_start = __va(ia64_boot_param->efi_memmap); efi_map_start = __va(ia64_boot_param->efi_memmap);
efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size; efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
...@@ -463,13 +461,11 @@ efi_map_pal_code (void) ...@@ -463,13 +461,11 @@ efi_map_pal_code (void)
ia64_set_psr(psr); /* restore psr */ ia64_set_psr(psr); /* restore psr */
ia64_srlz_i(); ia64_srlz_i();
#ifdef CONFIG_IA64_MCA
cpu = smp_processor_id(); cpu = smp_processor_id();
/* insert this TR into our list for MCA recovery purposes */ /* 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_base = vaddr & mask;
ia64_mca_tlb_list[cpu].pal_paddr = pte_val(mk_pte_phys(md->phys_addr, PAGE_KERNEL)); 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) ...@@ -355,10 +355,8 @@ setup_arch (char **cmdline_p)
# endif # endif
#endif #endif
#ifdef CONFIG_IA64_MCA
/* enable IA-64 Machine Check Abort Handling */ /* enable IA-64 Machine Check Abort Handling */
ia64_mca_init(); ia64_mca_init();
#endif
platform_setup(cmdline_p); platform_setup(cmdline_p);
paging_init(); paging_init();
......
...@@ -300,9 +300,7 @@ smp_callin (void) ...@@ -300,9 +300,7 @@ smp_callin (void)
*/ */
ia64_set_kr(IA64_KR_IO_BASE, __pa(ia64_iobase)); ia64_set_kr(IA64_KR_IO_BASE, __pa(ia64_iobase));
#ifdef CONFIG_IA64_MCA
ia64_mca_cmc_vector_setup(); /* Setup vector on AP & enable */ ia64_mca_cmc_vector_setup(); /* Setup vector on AP & enable */
#endif
#ifdef CONFIG_PERFMON #ifdef CONFIG_PERFMON
pfm_init_percpu(); pfm_init_percpu();
......
...@@ -46,6 +46,8 @@ show_mem (void) ...@@ -46,6 +46,8 @@ show_mem (void)
printk("Free swap: %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); printk("Free swap: %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
i = max_mapnr; i = max_mapnr;
while (i-- > 0) { while (i-- > 0) {
if (!pfn_valid(i))
continue;
total++; total++;
if (PageReserved(mem_map+i)) if (PageReserved(mem_map+i))
reserved++; reserved++;
......
...@@ -499,6 +499,8 @@ void show_mem(void) ...@@ -499,6 +499,8 @@ void show_mem(void)
for_each_pgdat(pgdat) { for_each_pgdat(pgdat) {
printk("Node ID: %d\n", pgdat->node_id); printk("Node ID: %d\n", pgdat->node_id);
for(i = 0; i < pgdat->node_spanned_pages; i++) { 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)) if (PageReserved(pgdat->node_mem_map+i))
reserved++; reserved++;
else if (PageSwapCache(pgdat->node_mem_map+i)) else if (PageSwapCache(pgdat->node_mem_map+i))
......
...@@ -279,9 +279,7 @@ ia64_mmu_init (void *my_cpu_data) ...@@ -279,9 +279,7 @@ ia64_mmu_init (void *my_cpu_data)
{ {
unsigned long psr, pta, impl_va_bits; unsigned long psr, pta, impl_va_bits;
extern void __init tlb_init (void); extern void __init tlb_init (void);
#ifdef CONFIG_IA64_MCA
int cpu; int cpu;
#endif
#ifdef CONFIG_DISABLE_VHPT #ifdef CONFIG_DISABLE_VHPT
# define VHPT_ENABLE_BIT 0 # define VHPT_ENABLE_BIT 0
...@@ -346,7 +344,6 @@ ia64_mmu_init (void *my_cpu_data) ...@@ -346,7 +344,6 @@ ia64_mmu_init (void *my_cpu_data)
ia64_set_rr(HPAGE_REGION_BASE, HPAGE_SHIFT << 2); ia64_set_rr(HPAGE_REGION_BASE, HPAGE_SHIFT << 2);
#endif #endif
#ifdef CONFIG_IA64_MCA
cpu = smp_processor_id(); cpu = smp_processor_id();
/* mca handler uses cr.lid as key to pick the right entry */ /* mca handler uses cr.lid as key to pick the right entry */
...@@ -360,7 +357,6 @@ ia64_mmu_init (void *my_cpu_data) ...@@ -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_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[0] = local_cpu_data->ptce_stride[0];
ia64_mca_tlb_list[cpu].ptce_stride[1] = local_cpu_data->ptce_stride[1]; ia64_mca_tlb_list[cpu].ptce_stride[1] = local_cpu_data->ptce_stride[1];
#endif
} }
#ifdef CONFIG_VIRTUAL_MEM_MAP #ifdef CONFIG_VIRTUAL_MEM_MAP
...@@ -459,8 +455,11 @@ int ...@@ -459,8 +455,11 @@ int
ia64_pfn_valid (unsigned long pfn) ia64_pfn_valid (unsigned long pfn)
{ {
char byte; 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); EXPORT_SYMBOL(ia64_pfn_valid);
......
...@@ -194,10 +194,7 @@ early_sn_setup(void) ...@@ -194,10 +194,7 @@ early_sn_setup(void)
} }
} }
#ifdef CONFIG_IA64_MCA
extern int platform_intr_list[]; extern int platform_intr_list[];
#endif
extern nasid_t master_nasid; extern nasid_t master_nasid;
static int shub_1_1_found __initdata; static int shub_1_1_found __initdata;
......
...@@ -27,10 +27,6 @@ ...@@ -27,10 +27,6 @@
#define HP_ZX1_TCNFG 0x318 #define HP_ZX1_TCNFG 0x318
#define HP_ZX1_PDIR_BASE 0x320 #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_BASE GB(1UL)
#define HP_ZX1_IOVA_SIZE GB(1UL) #define HP_ZX1_IOVA_SIZE GB(1UL)
#define HP_ZX1_GART_SIZE (HP_ZX1_IOVA_SIZE / 2) #define HP_ZX1_GART_SIZE (HP_ZX1_IOVA_SIZE / 2)
...@@ -39,6 +35,9 @@ ...@@ -39,6 +35,9 @@
#define HP_ZX1_PDIR_VALID_BIT 0x8000000000000000UL #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 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. */ /* AGP bridge need not be PCI device, but DRM thinks it is. */
static struct pci_dev fake_bridge_dev; static struct pci_dev fake_bridge_dev;
...@@ -57,6 +56,7 @@ static struct gatt_mask hp_zx1_masks[] = ...@@ -57,6 +56,7 @@ static struct gatt_mask hp_zx1_masks[] =
static struct _hp_private { static struct _hp_private {
volatile u8 *ioc_regs; volatile u8 *ioc_regs;
volatile u8 *lba_regs; volatile u8 *lba_regs;
int lba_cap_offset;
u64 *io_pdir; // PDIR for entire IOVA u64 *io_pdir; // PDIR for entire IOVA
u64 *gatt; // PDIR just for GART (subset of above) u64 *gatt; // PDIR just for GART (subset of above)
u64 gatt_entries; u64 gatt_entries;
...@@ -109,6 +109,7 @@ static int __init hp_zx1_ioc_shared(void) ...@@ -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)]; hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)];
if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) { if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) {
/* Normal case when no AGP device in system */
hp->gatt = 0; hp->gatt = 0;
hp->gatt_entries = 0; hp->gatt_entries = 0;
printk(KERN_ERR PFX "No reserved IO PDIR entry found; " printk(KERN_ERR PFX "No reserved IO PDIR entry found; "
...@@ -156,12 +157,13 @@ hp_zx1_ioc_owner (void) ...@@ -156,12 +157,13 @@ hp_zx1_ioc_owner (void)
} }
static int __init 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; struct _hp_private *hp = &hp_private;
hp->ioc_regs = ioremap(ioc_hpa, 1024); hp->ioc_regs = ioremap(hpa, 1024);
hp->lba_regs = ioremap(lba_hpa, 256); if (!hp->ioc_regs)
return -ENOMEM;
/* /*
* If the IOTLB is currently disabled, we can take it over. * 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) ...@@ -175,6 +177,51 @@ hp_zx1_ioc_init (u64 ioc_hpa, u64 lba_hpa)
return hp_zx1_ioc_shared(); 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 static int
hp_zx1_fetch_size(void) hp_zx1_fetch_size(void)
{ {
...@@ -192,13 +239,8 @@ hp_zx1_configure (void) ...@@ -192,13 +239,8 @@ hp_zx1_configure (void)
struct _hp_private *hp = &hp_private; struct _hp_private *hp = &hp_private;
agp_bridge->gart_bus_addr = hp->gart_base; agp_bridge->gart_bus_addr = hp->gart_base;
#if 0 agp_bridge->capndx = hp->lba_cap_offset;
/* ouch!! can't do that with a non-PCI AGP bridge... */ agp_bridge->mode = INREG32(hp->lba_regs, hp->lba_cap_offset + PCI_AGP_STATUS);
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);
if (hp->io_pdir_owner) { if (hp->io_pdir_owner) {
OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_phys(hp->io_pdir)); OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_phys(hp->io_pdir));
...@@ -217,9 +259,13 @@ hp_zx1_cleanup (void) ...@@ -217,9 +259,13 @@ hp_zx1_cleanup (void)
{ {
struct _hp_private *hp = &hp_private; struct _hp_private *hp = &hp_private;
if (hp->io_pdir_owner) if (hp->ioc_regs) {
OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, 0); if (hp->io_pdir_owner)
iounmap((void *) hp->ioc_regs); OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, 0);
iounmap((void *) hp->ioc_regs);
}
if (hp->lba_regs)
iounmap((void *) hp->lba_regs);
} }
static void static void
...@@ -350,14 +396,14 @@ hp_zx1_enable (u32 mode) ...@@ -350,14 +396,14 @@ hp_zx1_enable (u32 mode)
struct _hp_private *hp = &hp_private; struct _hp_private *hp = &hp_private;
u32 command; 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 = agp_collect_device_status(mode, command);
command |= 0x00000100; 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 = { struct agp_bridge_driver hp_zx1_driver = {
...@@ -386,22 +432,32 @@ static int __init ...@@ -386,22 +432,32 @@ static int __init
hp_zx1_setup (u64 ioc_hpa, u64 lba_hpa) hp_zx1_setup (u64 ioc_hpa, u64 lba_hpa)
{ {
struct agp_bridge_data *bridge; struct agp_bridge_data *bridge;
int error; int error = 0;
error = hp_zx1_ioc_init(ioc_hpa);
if (error)
goto fail;
error = hp_zx1_ioc_init(ioc_hpa, lba_hpa); error = hp_zx1_lba_init(lba_hpa);
if (error) if (error)
return error; goto fail;
bridge = agp_alloc_bridge(); bridge = agp_alloc_bridge();
if (!bridge) if (!bridge) {
return -ENOMEM; error = -ENOMEM;
goto fail;
}
bridge->driver = &hp_zx1_driver; bridge->driver = &hp_zx1_driver;
fake_bridge_dev.vendor = PCI_VENDOR_ID_HP; fake_bridge_dev.vendor = PCI_VENDOR_ID_HP;
fake_bridge_dev.device = PCI_DEVICE_ID_HP_PCIX_LBA; fake_bridge_dev.device = PCI_DEVICE_ID_HP_PCIX_LBA;
bridge->dev = &fake_bridge_dev; 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 static acpi_status __init
...@@ -416,7 +472,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret) ...@@ -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); status = hp_acpi_csr_space(obj, &lba_hpa, &length);
if (ACPI_FAILURE(status)) 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 */ /* Look for an enclosing IOC scope and find its CSR space */
handle = obj; handle = obj;
...@@ -452,7 +508,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret) ...@@ -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); (char *) context, sba_hpa + HP_ZX1_IOC_OFFSET, lba_hpa);
hp_zx1_gart_found = 1; hp_zx1_gart_found = 1;
return AE_CTRL_TERMINATE; return AE_CTRL_TERMINATE; /* we only support one bridge; quit looking */
} }
static int __init static int __init
......
...@@ -977,7 +977,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count) ...@@ -977,7 +977,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count)
} }
sn_func->sal_puts(s, count); sn_func->sal_puts(s, count);
} }
else else {
/* Output '\r' before each '\n' */ /* Output '\r' before each '\n' */
while ((s1 = memchr(s, '\n', count)) != NULL) { while ((s1 = memchr(s, '\n', count)) != NULL) {
sn_sal_write(NULL, 0, s, s1 - s); sn_sal_write(NULL, 0, s, s1 - s);
...@@ -986,6 +986,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count) ...@@ -986,6 +986,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count)
s = s1 + 1; s = s1 + 1;
} }
sn_sal_write(NULL, 0, s, count); sn_sal_write(NULL, 0, s, count);
}
} }
static struct tty_driver * static struct tty_driver *
......
...@@ -93,7 +93,8 @@ ia64_acpi_release_global_lock (unsigned int *lock) ...@@ -93,7 +93,8 @@ ia64_acpi_release_global_lock (unsigned int *lock)
const char *acpi_get_sysname (void); const char *acpi_get_sysname (void);
int acpi_request_vector (u32 int_type); int acpi_request_vector (u32 int_type);
int acpi_register_irq (u32 gsi, u32 polarity, u32 trigger); 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 #ifdef CONFIG_ACPI_NUMA
/* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ /* 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