Merge master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6

This commit is contained in:
Linus Torvalds 2006-01-10 21:31:24 -08:00
commit 05f6ece6f3
37 changed files with 373 additions and 228 deletions

View File

@ -29,9 +29,9 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/sections.h> #include <asm/sections.h>
int split_tlb; int split_tlb __read_mostly;
int dcache_stride; int dcache_stride __read_mostly;
int icache_stride; int icache_stride __read_mostly;
EXPORT_SYMBOL(dcache_stride); EXPORT_SYMBOL(dcache_stride);
@ -45,29 +45,29 @@ DEFINE_SPINLOCK(pa_tlb_lock);
EXPORT_SYMBOL(pa_tlb_lock); EXPORT_SYMBOL(pa_tlb_lock);
#endif #endif
struct pdc_cache_info cache_info; struct pdc_cache_info cache_info __read_mostly;
#ifndef CONFIG_PA20 #ifndef CONFIG_PA20
static struct pdc_btlb_info btlb_info; static struct pdc_btlb_info btlb_info __read_mostly;
#endif #endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
void void
flush_data_cache(void) flush_data_cache(void)
{ {
on_each_cpu((void (*)(void *))flush_data_cache_local, NULL, 1, 1); on_each_cpu(flush_data_cache_local, NULL, 1, 1);
} }
void void
flush_instruction_cache(void) flush_instruction_cache(void)
{ {
on_each_cpu((void (*)(void *))flush_instruction_cache_local, NULL, 1, 1); on_each_cpu(flush_instruction_cache_local, NULL, 1, 1);
} }
#endif #endif
void void
flush_cache_all_local(void) flush_cache_all_local(void)
{ {
flush_instruction_cache_local(); flush_instruction_cache_local(NULL);
flush_data_cache_local(); flush_data_cache_local(NULL);
} }
EXPORT_SYMBOL(flush_cache_all_local); EXPORT_SYMBOL(flush_cache_all_local);
@ -332,7 +332,7 @@ void clear_user_page_asm(void *page, unsigned long vaddr)
} }
#define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
int parisc_cache_flush_threshold = FLUSH_THRESHOLD; int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD;
void parisc_setup_cache_timing(void) void parisc_setup_cache_timing(void)
{ {

View File

@ -39,7 +39,7 @@
#include <asm/parisc-device.h> #include <asm/parisc-device.h>
/* See comments in include/asm-parisc/pci.h */ /* See comments in include/asm-parisc/pci.h */
struct hppa_dma_ops *hppa_dma_ops; struct hppa_dma_ops *hppa_dma_ops __read_mostly;
EXPORT_SYMBOL(hppa_dma_ops); EXPORT_SYMBOL(hppa_dma_ops);
static struct device root = { static struct device root = {
@ -515,8 +515,13 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
(iodc_data[5] << 8) | iodc_data[6]; (iodc_data[5] << 8) | iodc_data[6];
dev->hpa.name = parisc_pathname(dev); dev->hpa.name = parisc_pathname(dev);
dev->hpa.start = hpa; dev->hpa.start = hpa;
if (hpa == 0xf4000000 || hpa == 0xf6000000 || /* This is awkward. The STI spec says that gfx devices may occupy
hpa == 0xf8000000 || hpa == 0xfa000000) { * 32MB or 64MB. Unfortunately, we don't know how to tell whether
* it's the former or the latter. Assumptions either way can hurt us.
*/
if (hpa == 0xf4000000 || hpa == 0xf8000000) {
dev->hpa.end = hpa + 0x03ffffff;
} else if (hpa == 0xf6000000 || hpa == 0xfa000000) {
dev->hpa.end = hpa + 0x01ffffff; dev->hpa.end = hpa + 0x01ffffff;
} else { } else {
dev->hpa.end = hpa + 0xfff; dev->hpa.end = hpa + 0xfff;

View File

@ -80,7 +80,7 @@ static unsigned long pdc_result2[32] __attribute__ ((aligned (8)));
/* Firmware needs to be initially set to narrow to determine the /* Firmware needs to be initially set to narrow to determine the
* actual firmware width. */ * actual firmware width. */
int parisc_narrow_firmware = 1; int parisc_narrow_firmware __read_mostly = 1;
#endif #endif
/* On most currently-supported platforms, IODC I/O calls are 32-bit calls /* On most currently-supported platforms, IODC I/O calls are 32-bit calls

View File

@ -551,6 +551,7 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
{HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"}, {HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"},
{HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"}, {HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"},
{HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"}, {HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"},
{HPHW_BRIDGE, 0x05D, 0x0000A, 0x00, "SummitHawk Dino PCI Bridge"},
{HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"}, {HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"},
{HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"}, {HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"},
{HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"}, {HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"},

View File

@ -38,7 +38,7 @@
*/ */
#undef DEBUG_PAT #undef DEBUG_PAT
int pdc_type = PDC_TYPE_ILLEGAL; int pdc_type __read_mostly = PDC_TYPE_ILLEGAL;
void __init setup_pdc(void) void __init setup_pdc(void)
{ {
@ -120,8 +120,8 @@ set_pmem_entry(physmem_range_t *pmem_ptr, unsigned long start,
* pdc info is bad in this case). * pdc info is bad in this case).
*/ */
if ( ((start & (PAGE_SIZE - 1)) != 0) if (unlikely( ((start & (PAGE_SIZE - 1)) != 0)
|| ((pages4k & ((1UL << PDC_PAGE_ADJ_SHIFT) - 1)) != 0) ) { || ((pages4k & ((1UL << PDC_PAGE_ADJ_SHIFT) - 1)) != 0) )) {
panic("Memory range doesn't align with page size!\n"); panic("Memory range doesn't align with page size!\n");
} }

View File

@ -33,10 +33,10 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/tlbflush.h> /* for purge_tlb_*() macros */ #include <asm/tlbflush.h> /* for purge_tlb_*() macros */
static struct proc_dir_entry * proc_gsc_root = NULL; static struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length); static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
static unsigned long pcxl_used_bytes = 0; static unsigned long pcxl_used_bytes __read_mostly = 0;
static unsigned long pcxl_used_pages = 0; static unsigned long pcxl_used_pages __read_mostly = 0;
extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */ extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */
static spinlock_t pcxl_res_lock; static spinlock_t pcxl_res_lock;

View File

@ -30,6 +30,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/cache.h>
#include <asm/pdc_chassis.h> #include <asm/pdc_chassis.h>
#include <asm/processor.h> #include <asm/processor.h>
@ -38,8 +39,8 @@
#ifdef CONFIG_PDC_CHASSIS #ifdef CONFIG_PDC_CHASSIS
static int pdc_chassis_old = 0; static int pdc_chassis_old __read_mostly = 0;
static unsigned int pdc_chassis_enabled = 1; static unsigned int pdc_chassis_enabled __read_mostly = 1;
/** /**
@ -132,7 +133,7 @@ void __init parisc_pdc_chassis_init(void)
{ {
#ifdef CONFIG_PDC_CHASSIS #ifdef CONFIG_PDC_CHASSIS
int handle = 0; int handle = 0;
if (pdc_chassis_enabled) { if (likely(pdc_chassis_enabled)) {
DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__); DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
/* Let see if we have something to handle... */ /* Let see if we have something to handle... */
@ -142,7 +143,7 @@ void __init parisc_pdc_chassis_init(void)
printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n"); printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
handle = 1; handle = 1;
} }
else if (pdc_chassis_old) { else if (unlikely(pdc_chassis_old)) {
printk(KERN_INFO "Enabling old style chassis LED panel support.\n"); printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
handle = 1; handle = 1;
} }
@ -178,7 +179,7 @@ int pdc_chassis_send_status(int message)
/* Maybe we should do that in an other way ? */ /* Maybe we should do that in an other way ? */
int retval = 0; int retval = 0;
#ifdef CONFIG_PDC_CHASSIS #ifdef CONFIG_PDC_CHASSIS
if (pdc_chassis_enabled) { if (likely(pdc_chassis_enabled)) {
DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message); DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
@ -214,7 +215,7 @@ int pdc_chassis_send_status(int message)
} }
} else retval = -1; } else retval = -1;
#else #else
if (pdc_chassis_old) { if (unlikely(pdc_chassis_old)) {
switch (message) { switch (message) {
case PDC_CHASSIS_DIRECT_BSTART: case PDC_CHASSIS_DIRECT_BSTART:
case PDC_CHASSIS_DIRECT_BCOMPLETE: case PDC_CHASSIS_DIRECT_BCOMPLETE:

View File

@ -66,10 +66,10 @@ struct rdr_tbl_ent {
uint8_t write_control; uint8_t write_control;
}; };
static int perf_processor_interface = UNKNOWN_INTF; static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
static int perf_enabled = 0; static int perf_enabled __read_mostly = 0;
static spinlock_t perf_lock; static spinlock_t perf_lock;
struct parisc_device *cpu_device = NULL; struct parisc_device *cpu_device __read_mostly = NULL;
/* RDRs to write for PCX-W */ /* RDRs to write for PCX-W */
static int perf_rdrs_W[] = static int perf_rdrs_W[] =

View File

@ -54,7 +54,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unwind.h> #include <asm/unwind.h>
static int hlt_counter; static int hlt_counter __read_mostly;
/* /*
* Power off function, if any * Power off function, if any

View File

@ -44,10 +44,10 @@
#include <asm/irq.h> /* for struct irq_region */ #include <asm/irq.h> /* for struct irq_region */
#include <asm/parisc-device.h> #include <asm/parisc-device.h>
struct system_cpuinfo_parisc boot_cpu_data; struct system_cpuinfo_parisc boot_cpu_data __read_mostly;
EXPORT_SYMBOL(boot_cpu_data); EXPORT_SYMBOL(boot_cpu_data);
struct cpuinfo_parisc cpu_data[NR_CPUS]; struct cpuinfo_parisc cpu_data[NR_CPUS] __read_mostly;
/* /*
** PARISC CPU driver - claim "device" and initialize CPU data structures. ** PARISC CPU driver - claim "device" and initialize CPU data structures.
@ -378,12 +378,12 @@ show_cpuinfo (struct seq_file *m, void *v)
return 0; return 0;
} }
static struct parisc_device_id processor_tbl[] = { static struct parisc_device_id processor_tbl[] __read_mostly = {
{ HPHW_NPROC, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, SVERSION_ANY_ID }, { HPHW_NPROC, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, SVERSION_ANY_ID },
{ 0, } { 0, }
}; };
static struct parisc_driver cpu_driver = { static struct parisc_driver cpu_driver __read_mostly = {
.name = "CPU", .name = "CPU",
.id_table = processor_tbl, .id_table = processor_tbl,
.probe = processor_probe .probe = processor_probe

View File

@ -46,15 +46,15 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/setup.h> #include <asm/setup.h>
char command_line[COMMAND_LINE_SIZE]; char command_line[COMMAND_LINE_SIZE] __read_mostly;
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */ /* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
struct proc_dir_entry * proc_runway_root = NULL; struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
struct proc_dir_entry * proc_gsc_root = NULL; struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
struct proc_dir_entry * proc_mckinley_root = NULL; struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL;
#if !defined(CONFIG_PA20) && (defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA)) #if !defined(CONFIG_PA20) && (defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA))
int parisc_bus_is_phys = 1; /* Assume no IOMMU is present */ int parisc_bus_is_phys __read_mostly = 1; /* Assume no IOMMU is present */
EXPORT_SYMBOL(parisc_bus_is_phys); EXPORT_SYMBOL(parisc_bus_is_phys);
#endif #endif

View File

@ -39,7 +39,7 @@
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/current.h> #include <asm/current.h>
#include <asm/delay.h> #include <asm/delay.h>
#include <asm/pgalloc.h> /* for flush_tlb_all() proto/macro */ #include <asm/tlbflush.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> /* for CPU_IRQ_REGION and friends */ #include <asm/irq.h> /* for CPU_IRQ_REGION and friends */
@ -58,9 +58,9 @@ DEFINE_SPINLOCK(smp_lock);
volatile struct task_struct *smp_init_current_idle_task; volatile struct task_struct *smp_init_current_idle_task;
static volatile int cpu_now_booting = 0; /* track which CPU is booting */ static volatile int cpu_now_booting __read_mostly = 0; /* track which CPU is booting */
static int parisc_max_cpus = 1; static int parisc_max_cpus __read_mostly = 1;
/* online cpus are ones that we've managed to bring up completely /* online cpus are ones that we've managed to bring up completely
* possible cpus are all valid cpu * possible cpus are all valid cpu
@ -71,8 +71,8 @@ static int parisc_max_cpus = 1;
* empty in the beginning. * empty in the beginning.
*/ */
cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */ cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE; /* Bitmap of online CPUs */
cpumask_t cpu_possible_map = CPU_MASK_ALL; /* Bitmap of Present CPUs */ cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CPUs */
EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_online_map);
EXPORT_SYMBOL(cpu_possible_map); EXPORT_SYMBOL(cpu_possible_map);
@ -406,12 +406,10 @@ EXPORT_SYMBOL(smp_call_function);
* as we want to ensure all TLB's flushed before proceeding. * as we want to ensure all TLB's flushed before proceeding.
*/ */
extern void flush_tlb_all_local(void);
void void
smp_flush_tlb_all(void) smp_flush_tlb_all(void)
{ {
on_each_cpu((void (*)(void *))flush_tlb_all_local, NULL, 1, 1); on_each_cpu(flush_tlb_all_local, NULL, 1, 1);
} }
@ -487,7 +485,7 @@ void __init smp_callin(void)
#endif #endif
flush_cache_all_local(); /* start with known state */ flush_cache_all_local(); /* start with known state */
flush_tlb_all_local(); flush_tlb_all_local(NULL);
local_irq_enable(); /* Interrupts have been off until now */ local_irq_enable(); /* Interrupts have been off until now */

View File

@ -36,8 +36,8 @@
/* xtime and wall_jiffies keep wall-clock time */ /* xtime and wall_jiffies keep wall-clock time */
extern unsigned long wall_jiffies; extern unsigned long wall_jiffies;
static long clocktick; /* timer cycles per tick */ static long clocktick __read_mostly; /* timer cycles per tick */
static long halftick; static long halftick __read_mostly;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void smp_do_timer(struct pt_regs *regs); extern void smp_do_timer(struct pt_regs *regs);

View File

@ -20,8 +20,9 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/cache.h>
static struct cpu cpu_devices[NR_CPUS]; static struct cpu cpu_devices[NR_CPUS] __read_mostly;
static int __init topology_init(void) static int __init topology_init(void)
{ {

View File

@ -122,7 +122,7 @@
#define ERR_NOTHANDLED -1 #define ERR_NOTHANDLED -1
#define ERR_PAGEFAULT -2 #define ERR_PAGEFAULT -2
int unaligned_enabled = 1; int unaligned_enabled __read_mostly = 1;
void die_if_kernel (char *str, struct pt_regs *regs, long err); void die_if_kernel (char *str, struct pt_regs *regs, long err);

View File

@ -35,7 +35,7 @@ static spinlock_t unwind_lock;
* we can call unwind_init as early in the bootup process as * we can call unwind_init as early in the bootup process as
* possible (before the slab allocator is initialized) * possible (before the slab allocator is initialized)
*/ */
static struct unwind_table kernel_unwind_table; static struct unwind_table kernel_unwind_table __read_mostly;
static LIST_HEAD(unwind_tables); static LIST_HEAD(unwind_tables);
static inline const struct unwind_table_entry * static inline const struct unwind_table_entry *

View File

@ -68,7 +68,7 @@ SECTIONS
RODATA RODATA
/* writeable */ /* writeable */
. = ALIGN(4096); /* Make sure this is paged aligned so . = ALIGN(4096); /* Make sure this is page aligned so
that we can properly leave these that we can properly leave these
as writable */ as writable */
data_start = .; data_start = .;
@ -105,6 +105,10 @@ SECTIONS
. = ALIGN(16); . = ALIGN(16);
.data.lock_aligned : { *(.data.lock_aligned) } .data.lock_aligned : { *(.data.lock_aligned) }
/* rarely changed data like cpu maps */
. = ALIGN(16);
.data.read_mostly : { *(.data.read_mostly) }
_edata = .; /* End of data section */ _edata = .; /* End of data section */
. = ALIGN(16384); /* init_task */ . = ALIGN(16384); /* init_task */
@ -194,14 +198,7 @@ SECTIONS
#endif #endif
} }
/* Stabs debugging sections. */ STABS_DEBUG
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.note 0 : { *(.note) } .note 0 : { *(.note) }
} }

View File

@ -36,9 +36,9 @@ extern char _end; /* end of BSS, defined by linker */
extern char __init_begin, __init_end; extern char __init_begin, __init_end;
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
struct node_map_data node_data[MAX_NUMNODES]; struct node_map_data node_data[MAX_NUMNODES] __read_mostly;
bootmem_data_t bmem_data[MAX_NUMNODES]; bootmem_data_t bmem_data[MAX_NUMNODES] __read_mostly;
unsigned char pfnnid_map[PFNNID_MAP_MAX]; unsigned char pfnnid_map[PFNNID_MAP_MAX] __read_mostly;
#endif #endif
static struct resource data_resource = { static struct resource data_resource = {
@ -58,14 +58,14 @@ static struct resource pdcdata_resource = {
.flags = IORESOURCE_BUSY | IORESOURCE_MEM, .flags = IORESOURCE_BUSY | IORESOURCE_MEM,
}; };
static struct resource sysram_resources[MAX_PHYSMEM_RANGES]; static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;
/* The following array is initialized from the firmware specific /* The following array is initialized from the firmware specific
* information retrieved in kernel/inventory.c. * information retrieved in kernel/inventory.c.
*/ */
physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES]; physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly;
int npmem_ranges; int npmem_ranges __read_mostly;
#ifdef __LP64__ #ifdef __LP64__
#define MAX_MEM (~0UL) #define MAX_MEM (~0UL)
@ -73,7 +73,7 @@ int npmem_ranges;
#define MAX_MEM (3584U*1024U*1024U) #define MAX_MEM (3584U*1024U*1024U)
#endif /* !__LP64__ */ #endif /* !__LP64__ */
static unsigned long mem_limit = MAX_MEM; static unsigned long mem_limit __read_mostly = MAX_MEM;
static void __init mem_limit_func(void) static void __init mem_limit_func(void)
{ {
@ -300,6 +300,13 @@ static void __init setup_bootmem(void)
max_pfn = start_pfn + npages; max_pfn = start_pfn + npages;
} }
/* IOMMU is always used to access "high mem" on those boxes
* that can support enough mem that a PCI device couldn't
* directly DMA to any physical addresses.
* ISA DMA support will need to revisit this.
*/
max_low_pfn = max_pfn;
if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) { if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) {
printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n"); printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n");
BUG(); BUG();
@ -431,11 +438,11 @@ void free_initmem(void)
#define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \ #define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \
& ~(VM_MAP_OFFSET-1))) & ~(VM_MAP_OFFSET-1)))
void *vmalloc_start; void *vmalloc_start __read_mostly;
EXPORT_SYMBOL(vmalloc_start); EXPORT_SYMBOL(vmalloc_start);
#ifdef CONFIG_PA11 #ifdef CONFIG_PA11
unsigned long pcxl_dma_start; unsigned long pcxl_dma_start __read_mostly;
#endif #endif
void __init mem_init(void) void __init mem_init(void)
@ -475,7 +482,7 @@ int do_check_pgt_cache(int low, int high)
return 0; return 0;
} }
unsigned long *empty_zero_page; unsigned long *empty_zero_page __read_mostly;
void show_mem(void) void show_mem(void)
{ {
@ -998,7 +1005,7 @@ void flush_tlb_all(void)
void flush_tlb_all(void) void flush_tlb_all(void)
{ {
spin_lock(&sid_lock); spin_lock(&sid_lock);
flush_tlb_all_local(); flush_tlb_all_local(NULL);
recycle_sids(); recycle_sids();
spin_unlock(&sid_lock); spin_unlock(&sid_lock);
} }

View File

@ -1,12 +1,9 @@
/* /*
* arch/parisc/mm/ioremap.c * arch/parisc/mm/ioremap.c
* *
* Re-map IO memory to kernel address space so that we can access it.
* This is needed for high PCI addresses that aren't mapped in the
* 640k-1MB IO memory area on PC's
*
* (C) Copyright 1995 1996 Linus Torvalds * (C) Copyright 1995 1996 Linus Torvalds
* (C) Copyright 2001 Helge Deller <deller@gmx.de> * (C) Copyright 2001 Helge Deller <deller@gmx.de>
* (C) Copyright 2005 Kyle McMartin <kyle@parisc-linux.org>
*/ */
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
@ -14,81 +11,107 @@
#include <linux/module.h> #include <linux/module.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/tlbflush.h>
#include <asm/cacheflush.h>
static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size, static inline void
remap_area_pte(pte_t *pte, unsigned long address, unsigned long size,
unsigned long phys_addr, unsigned long flags) unsigned long phys_addr, unsigned long flags)
{ {
unsigned long end; unsigned long end, pfn;
pgprot_t pgprot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY |
_PAGE_ACCESSED | flags);
address &= ~PMD_MASK; address &= ~PMD_MASK;
end = address + size; end = address + size;
if (end > PMD_SIZE) if (end > PMD_SIZE)
end = PMD_SIZE; end = PMD_SIZE;
if (address >= end)
BUG(); BUG_ON(address >= end);
pfn = phys_addr >> PAGE_SHIFT;
do { do {
if (!pte_none(*pte)) { BUG_ON(!pte_none(*pte));
printk(KERN_ERR "remap_area_pte: page already exists\n");
BUG(); set_pte(pte, pfn_pte(pfn, pgprot));
}
set_pte(pte, mk_pte_phys(phys_addr, __pgprot(_PAGE_PRESENT | _PAGE_RW |
_PAGE_DIRTY | _PAGE_ACCESSED | flags)));
address += PAGE_SIZE; address += PAGE_SIZE;
phys_addr += PAGE_SIZE; pfn++;
pte++; pte++;
} while (address && (address < end)); } while (address && (address < end));
} }
static inline int remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, static inline int
remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size,
unsigned long phys_addr, unsigned long flags) unsigned long phys_addr, unsigned long flags)
{ {
unsigned long end; unsigned long end;
address &= ~PGDIR_MASK; address &= ~PGDIR_MASK;
end = address + size; end = address + size;
if (end > PGDIR_SIZE) if (end > PGDIR_SIZE)
end = PGDIR_SIZE; end = PGDIR_SIZE;
BUG_ON(address >= end);
phys_addr -= address; phys_addr -= address;
if (address >= end)
BUG();
do { do {
pte_t *pte = pte_alloc_kernel(pmd, address); pte_t *pte = pte_alloc_kernel(pmd, address);
if (!pte) if (!pte)
return -ENOMEM; return -ENOMEM;
remap_area_pte(pte, address, end - address, address + phys_addr, flags);
remap_area_pte(pte, address, end - address,
address + phys_addr, flags);
address = (address + PMD_SIZE) & PMD_MASK; address = (address + PMD_SIZE) & PMD_MASK;
pmd++; pmd++;
} while (address && (address < end)); } while (address && (address < end));
return 0; return 0;
} }
#if (USE_HPPA_IOREMAP) #if USE_HPPA_IOREMAP
static int remap_area_pages(unsigned long address, unsigned long phys_addr, static int
remap_area_pages(unsigned long address, unsigned long phys_addr,
unsigned long size, unsigned long flags) unsigned long size, unsigned long flags)
{ {
int error;
pgd_t *dir; pgd_t *dir;
int error = 0;
unsigned long end = address + size; unsigned long end = address + size;
BUG_ON(address >= end);
phys_addr -= address; phys_addr -= address;
dir = pgd_offset(&init_mm, address); dir = pgd_offset_k(address);
flush_cache_all(); flush_cache_all();
if (address >= end)
BUG();
do { do {
pud_t *pud;
pmd_t *pmd; pmd_t *pmd;
pmd = pmd_alloc(&init_mm, dir, address);
error = -ENOMEM; error = -ENOMEM;
pud = pud_alloc(&init_mm, dir, address);
if (!pud)
break;
pmd = pmd_alloc(&init_mm, pud, address);
if (!pmd) if (!pmd)
break; break;
if (remap_area_pmd(pmd, address, end - address, if (remap_area_pmd(pmd, address, end - address,
phys_addr + address, flags)) phys_addr + address, flags))
break; break;
error = 0; error = 0;
address = (address + PGDIR_SIZE) & PGDIR_MASK; address = (address + PGDIR_SIZE) & PGDIR_MASK;
dir++; dir++;
} while (address && (address < end)); } while (address && (address < end));
flush_tlb_all(); flush_tlb_all();
return error; return error;
} }
#endif /* USE_HPPA_IOREMAP */ #endif /* USE_HPPA_IOREMAP */
@ -123,8 +146,7 @@ EXPORT_SYMBOL(__raw_bad_addr);
/* /*
* Remap an arbitrary physical address space into the kernel virtual * Remap an arbitrary physical address space into the kernel virtual
* address space. Needed when the kernel wants to access high addresses * address space.
* directly.
* *
* NOTE! We need to allow non-page-aligned mappings too: we will obviously * NOTE! We need to allow non-page-aligned mappings too: we will obviously
* have to convert them into an offset in a page-aligned mapping, but the * have to convert them into an offset in a page-aligned mapping, but the
@ -167,10 +189,12 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
t_addr = __va(phys_addr); t_addr = __va(phys_addr);
t_end = t_addr + (size - 1); t_end = t_addr + (size - 1);
for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) for (page = virt_to_page(t_addr);
page <= virt_to_page(t_end); page++) {
if(!PageReserved(page)) if(!PageReserved(page))
return NULL; return NULL;
} }
}
/* /*
* Mappings have to be page-aligned * Mappings have to be page-aligned
@ -185,11 +209,13 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
area = get_vm_area(size, VM_IOREMAP); area = get_vm_area(size, VM_IOREMAP);
if (!area) if (!area)
return NULL; return NULL;
addr = area->addr; addr = area->addr;
if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) {
vfree(addr); vfree(addr);
return NULL; return NULL;
} }
return (void __iomem *) (offset + (char *)addr); return (void __iomem *) (offset + (char *)addr);
#endif #endif
} }

View File

@ -84,6 +84,7 @@
*/ */
#define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA) #define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA)
#define is_cujo(id) ((id)->hversion == 0x682)
#define DINO_IAR0 0x004 #define DINO_IAR0 0x004
#define DINO_IODC_ADDR 0x008 #define DINO_IODC_ADDR 0x008
@ -124,6 +125,7 @@
#define DINO_IRQS 11 /* bits 0-10 are architected */ #define DINO_IRQS 11 /* bits 0-10 are architected */
#define DINO_IRR_MASK 0x5ff /* only 10 bits are implemented */ #define DINO_IRR_MASK 0x5ff /* only 10 bits are implemented */
#define DINO_LOCAL_IRQS (DINO_IRQS+1)
#define DINO_MASK_IRQ(x) (1<<(x)) #define DINO_MASK_IRQ(x) (1<<(x))
@ -146,7 +148,7 @@ struct dino_device
unsigned long txn_addr; /* EIR addr to generate interrupt */ unsigned long txn_addr; /* EIR addr to generate interrupt */
u32 txn_data; /* EIR data assign to each dino */ u32 txn_data; /* EIR data assign to each dino */
u32 imr; /* IRQ's which are enabled */ u32 imr; /* IRQ's which are enabled */
int global_irq[12]; /* map IMR bit to global irq */ int global_irq[DINO_LOCAL_IRQS]; /* map IMR bit to global irq */
#ifdef DINO_DEBUG #ifdef DINO_DEBUG
unsigned int dino_irr0; /* save most recent IRQ line stat */ unsigned int dino_irr0; /* save most recent IRQ line stat */
#endif #endif
@ -297,7 +299,7 @@ struct pci_port_ops dino_port_ops = {
static void dino_disable_irq(unsigned int irq) static void dino_disable_irq(unsigned int irq)
{ {
struct dino_device *dino_dev = irq_desc[irq].handler_data; struct dino_device *dino_dev = irq_desc[irq].handler_data;
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS);
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
@ -309,7 +311,7 @@ static void dino_disable_irq(unsigned int irq)
static void dino_enable_irq(unsigned int irq) static void dino_enable_irq(unsigned int irq)
{ {
struct dino_device *dino_dev = irq_desc[irq].handler_data; struct dino_device *dino_dev = irq_desc[irq].handler_data;
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS);
u32 tmp; u32 tmp;
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq); DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
@ -435,6 +437,21 @@ static void dino_choose_irq(struct parisc_device *dev, void *ctrl)
dino_assign_irq(dino, irq, &dev->irq); dino_assign_irq(dino, irq, &dev->irq);
} }
/*
* Cirrus 6832 Cardbus reports wrong irq on RDI Tadpole PARISC Laptop (deller@gmx.de)
* (the irqs are off-by-one, not sure yet if this is a cirrus, dino-hardware or dino-driver problem...)
*/
static void __devinit quirk_cirrus_cardbus(struct pci_dev *dev)
{
u8 new_irq = dev->irq - 1;
printk(KERN_INFO "PCI: Cirrus Cardbus IRQ fixup for %s, from %d to %d\n",
pci_name(dev), dev->irq, new_irq);
dev->irq = new_irq;
}
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );
static void __init static void __init
dino_bios_init(void) dino_bios_init(void)
{ {
@ -666,7 +683,6 @@ dino_fixup_bus(struct pci_bus *bus)
printk(KERN_WARNING "Device %s has unassigned IRQ\n", pci_name(dev)); printk(KERN_WARNING "Device %s has unassigned IRQ\n", pci_name(dev));
#endif #endif
} else { } else {
/* Adjust INT_LINE for that busses region */ /* Adjust INT_LINE for that busses region */
dino_assign_irq(dino_dev, dev->irq, &dev->irq); dino_assign_irq(dino_dev, dev->irq, &dev->irq);
} }
@ -872,7 +888,7 @@ static int __init dino_common_init(struct parisc_device *dev,
/* allocate I/O Port resource region */ /* allocate I/O Port resource region */
res = &dino_dev->hba.io_space; res = &dino_dev->hba.io_space;
if (dev->id.hversion == 0x680 || is_card_dino(&dev->id)) { if (!is_cujo(&dev->id)) {
res->name = "Dino I/O Port"; res->name = "Dino I/O Port";
} else { } else {
res->name = "Cujo I/O Port"; res->name = "Cujo I/O Port";
@ -927,7 +943,7 @@ static int __init dino_probe(struct parisc_device *dev)
if (is_card_dino(&dev->id)) { if (is_card_dino(&dev->id)) {
version = "3.x (card mode)"; version = "3.x (card mode)";
} else { } else {
if(dev->id.hversion == 0x680) { if (!is_cujo(&dev->id)) {
if (dev->id.hversion_rev < 4) { if (dev->id.hversion_rev < 4) {
version = dino_vers[dev->id.hversion_rev]; version = dino_vers[dev->id.hversion_rev];
} }

View File

@ -57,7 +57,7 @@
static DEFINE_SPINLOCK(eisa_irq_lock); static DEFINE_SPINLOCK(eisa_irq_lock);
void __iomem *eisa_eeprom_addr; void __iomem *eisa_eeprom_addr __read_mostly;
/* We can only have one EISA adapter in the system because neither /* We can only have one EISA adapter in the system because neither
* implementation can be flexed. * implementation can be flexed.
@ -141,7 +141,7 @@ static int slave_mask;
* in the furure. * in the furure.
*/ */
/* irq 13,8,2,1,0 must be edge */ /* irq 13,8,2,1,0 must be edge */
static unsigned int eisa_irq_level; /* default to edge triggered */ static unsigned int eisa_irq_level __read_mostly; /* default to edge triggered */
/* called by free irq */ /* called by free irq */

View File

@ -48,7 +48,7 @@ static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin )
} }
static ssize_t eisa_eeprom_read(struct file * file, static ssize_t eisa_eeprom_read(struct file * file,
char *buf, size_t count, loff_t *ppos ) char __user *buf, size_t count, loff_t *ppos )
{ {
unsigned char *tmp; unsigned char *tmp;
ssize_t ret; ssize_t ret;

View File

@ -150,7 +150,7 @@ void __init lasi_led_init(unsigned long lasi_hpa)
* *
*/ */
static unsigned long lasi_power_off_hpa; static unsigned long lasi_power_off_hpa __read_mostly;
static void lasi_power_off(void) static void lasi_power_off(void)
{ {

View File

@ -167,7 +167,7 @@
/* non-postable I/O port space, densely packed */ /* non-postable I/O port space, densely packed */
#define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL) #define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL)
static void __iomem *astro_iop_base; static void __iomem *astro_iop_base __read_mostly;
#define ELROY_HVERS 0x782 #define ELROY_HVERS 0x782
#define MERCURY_HVERS 0x783 #define MERCURY_HVERS 0x783
@ -695,11 +695,71 @@ lba_claim_dev_resources(struct pci_dev *dev)
} }
} }
} }
#else
#define lba_claim_dev_resources(dev)
#endif
/*
* truncate_pat_collision: Deal with overlaps or outright collisions
* between PAT PDC reported ranges.
*
* Broken PA8800 firmware will report lmmio range that
* overlaps with CPU HPA. Just truncate the lmmio range.
*
* BEWARE: conflicts with this lmmio range may be an
* elmmio range which is pointing down another rope.
*
* FIXME: only deals with one collision per range...theoretically we
* could have several. Supporting more than one collision will get messy.
*/
static unsigned long
truncate_pat_collision(struct resource *root, struct resource *new)
{
unsigned long start = new->start;
unsigned long end = new->end;
struct resource *tmp = root->child;
if (end <= start || start < root->start || !tmp)
return 0;
/* find first overlap */
while (tmp && tmp->end < start)
tmp = tmp->sibling;
/* no entries overlap */
if (!tmp) return 0;
/* found one that starts behind the new one
** Don't need to do anything.
*/
if (tmp->start >= end) return 0;
if (tmp->start <= start) {
/* "front" of new one overlaps */
new->start = tmp->end + 1;
if (tmp->end >= end) {
/* AACCKK! totally overlaps! drop this range. */
return 1;
}
}
if (tmp->end < end ) {
/* "end" of new one overlaps */
new->end = tmp->start - 1;
}
printk(KERN_WARNING "LBA: Truncating lmmio_space [%lx/%lx] "
"to [%lx,%lx]\n",
start, end,
new->start, new->end );
return 0; /* truncation successful */
}
#else
#define lba_claim_dev_resources(dev) do { } while (0)
#define truncate_pat_collision(r,n) (0)
#endif
/* /*
** The algorithm is generic code. ** The algorithm is generic code.
** But it needs to access local data structures to get the IRQ base. ** But it needs to access local data structures to get the IRQ base.
@ -747,6 +807,9 @@ lba_fixup_bus(struct pci_bus *bus)
lba_dump_res(&ioport_resource, 2); lba_dump_res(&ioport_resource, 2);
BUG(); BUG();
} }
/* advertize Host bridge resources to PCI bus */
bus->resource[0] = &(ldev->hba.io_space);
i = 1;
if (ldev->hba.elmmio_space.start) { if (ldev->hba.elmmio_space.start) {
err = request_resource(&iomem_resource, err = request_resource(&iomem_resource,
@ -760,23 +823,35 @@ lba_fixup_bus(struct pci_bus *bus)
/* lba_dump_res(&iomem_resource, 2); */ /* lba_dump_res(&iomem_resource, 2); */
/* BUG(); */ /* BUG(); */
} } else
bus->resource[i++] = &(ldev->hba.elmmio_space);
} }
/* Overlaps with elmmio can (and should) fail here.
* We will prune (or ignore) the distributed range.
*
* FIXME: SBA code should register all elmmio ranges first.
* that would take care of elmmio ranges routed
* to a different rope (already discovered) from
* getting registered *after* LBA code has already
* registered it's distributed lmmio range.
*/
if (truncate_pat_collision(&iomem_resource,
&(ldev->hba.lmmio_space))) {
printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n",
ldev->hba.lmmio_space.start,
ldev->hba.lmmio_space.end);
} else {
err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space)); err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space));
if (err < 0) { if (err < 0) {
/* FIXME overlaps with elmmio will fail here. printk(KERN_ERR "FAILED: lba_fixup_bus() request for "
* Need to prune (or disable) the distributed range.
*
* BEWARE: conflicts with this lmmio range may be
* elmmio range which is pointing down another rope.
*/
printk("FAILED: lba_fixup_bus() request for "
"lmmio_space [%lx/%lx]\n", "lmmio_space [%lx/%lx]\n",
ldev->hba.lmmio_space.start, ldev->hba.lmmio_space.start,
ldev->hba.lmmio_space.end); ldev->hba.lmmio_space.end);
/* lba_dump_res(&iomem_resource, 2); */ } else
bus->resource[i++] = &(ldev->hba.lmmio_space);
} }
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
@ -791,18 +866,10 @@ lba_fixup_bus(struct pci_bus *bus)
lba_dump_res(&iomem_resource, 2); lba_dump_res(&iomem_resource, 2);
BUG(); BUG();
} }
bus->resource[i++] = &(ldev->hba.gmmio_space);
} }
#endif #endif
/* advertize Host bridge resources to PCI bus */
bus->resource[0] = &(ldev->hba.io_space);
bus->resource[1] = &(ldev->hba.lmmio_space);
i=2;
if (ldev->hba.elmmio_space.start)
bus->resource[i++] = &(ldev->hba.elmmio_space);
if (ldev->hba.gmmio_space.start)
bus->resource[i++] = &(ldev->hba.gmmio_space);
} }
list_for_each(ln, &bus->devices) { list_for_each(ln, &bus->devices) {

View File

@ -3,7 +3,7 @@
* *
* (c) Copyright 2000 Red Hat Software * (c) Copyright 2000 Red Hat Software
* (c) Copyright 2000 Helge Deller <hdeller@redhat.com> * (c) Copyright 2000 Helge Deller <hdeller@redhat.com>
* (c) Copyright 2001-2004 Helge Deller <deller@gmx.de> * (c) Copyright 2001-2005 Helge Deller <deller@gmx.de>
* (c) Copyright 2001 Randolph Chung <tausq@debian.org> * (c) Copyright 2001 Randolph Chung <tausq@debian.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -56,13 +56,13 @@
relatively large amount of CPU time, some of the calculations can be relatively large amount of CPU time, some of the calculations can be
turned off with the following variables (controlled via procfs) */ turned off with the following variables (controlled via procfs) */
static int led_type = -1; static int led_type __read_mostly = -1;
static unsigned char lastleds; /* LED state from most recent update */ static unsigned char lastleds; /* LED state from most recent update */
static unsigned int led_heartbeat = 1; static unsigned int led_heartbeat __read_mostly = 1;
static unsigned int led_diskio = 1; static unsigned int led_diskio __read_mostly = 1;
static unsigned int led_lanrxtx = 1; static unsigned int led_lanrxtx __read_mostly = 1;
static char lcd_text[32]; static char lcd_text[32] __read_mostly;
static char lcd_text_default[32]; static char lcd_text_default[32] __read_mostly;
static struct workqueue_struct *led_wq; static struct workqueue_struct *led_wq;
@ -108,7 +108,7 @@ struct pdc_chassis_lcd_info_ret_block {
/* lcd_info is pre-initialized to the values needed to program KittyHawk LCD's /* lcd_info is pre-initialized to the values needed to program KittyHawk LCD's
* HP seems to have used Sharp/Hitachi HD44780 LCDs most of the time. */ * HP seems to have used Sharp/Hitachi HD44780 LCDs most of the time. */
static struct pdc_chassis_lcd_info_ret_block static struct pdc_chassis_lcd_info_ret_block
lcd_info __attribute__((aligned(8))) = lcd_info __attribute__((aligned(8))) __read_mostly =
{ {
.model = DISPLAY_MODEL_LCD, .model = DISPLAY_MODEL_LCD,
.lcd_width = 16, .lcd_width = 16,
@ -144,7 +144,7 @@ static int start_task(void)
device_initcall(start_task); device_initcall(start_task);
/* ptr to LCD/LED-specific function */ /* ptr to LCD/LED-specific function */
static void (*led_func_ptr) (unsigned char); static void (*led_func_ptr) (unsigned char) __read_mostly;
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static int led_proc_read(char *page, char **start, off_t off, int count, static int led_proc_read(char *page, char **start, off_t off, int count,

View File

@ -56,7 +56,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#define PDCS_VERSION "0.09" #define PDCS_VERSION "0.10"
#define PDCS_ADDR_PPRI 0x00 #define PDCS_ADDR_PPRI 0x00
#define PDCS_ADDR_OSID 0x40 #define PDCS_ADDR_OSID 0x40
@ -70,7 +70,7 @@ MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION(PDCS_VERSION); MODULE_VERSION(PDCS_VERSION);
static unsigned long pdcs_size = 0; static unsigned long pdcs_size __read_mostly;
/* This struct defines what we need to deal with a parisc pdc path entry */ /* This struct defines what we need to deal with a parisc pdc path entry */
struct pdcspath_entry { struct pdcspath_entry {
@ -194,7 +194,8 @@ pdcspath_store(struct pdcspath_entry *entry)
return -EIO; return -EIO;
} }
entry->ready = 1; /* kobject is already registered */
entry->ready = 2;
DPRINTK("%s: device: 0x%p\n", __func__, entry->dev); DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
@ -653,14 +654,20 @@ pdcs_register_pathentries(void)
{ {
unsigned short i; unsigned short i;
struct pdcspath_entry *entry; struct pdcspath_entry *entry;
int err;
for (i = 0; (entry = pdcspath_entries[i]); i++) { for (i = 0; (entry = pdcspath_entries[i]); i++) {
if (pdcspath_fetch(entry) < 0) if (pdcspath_fetch(entry) < 0)
continue; continue;
kobject_set_name(&entry->kobj, "%s", entry->name); if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
return err;
kobj_set_kset_s(entry, paths_subsys); kobj_set_kset_s(entry, paths_subsys);
kobject_register(&entry->kobj); if ((err = kobject_register(&entry->kobj)))
return err;
/* kobject is now registered */
entry->ready = 2;
if (!entry->dev) if (!entry->dev)
continue; continue;
@ -675,14 +682,14 @@ pdcs_register_pathentries(void)
/** /**
* pdcs_unregister_pathentries - Routine called when unregistering the module. * pdcs_unregister_pathentries - Routine called when unregistering the module.
*/ */
static inline void __exit static inline void
pdcs_unregister_pathentries(void) pdcs_unregister_pathentries(void)
{ {
unsigned short i; unsigned short i;
struct pdcspath_entry *entry; struct pdcspath_entry *entry;
for (i = 0; (entry = pdcspath_entries[i]); i++) for (i = 0; (entry = pdcspath_entries[i]); i++)
if (entry->ready) if (entry->ready >= 2)
kobject_unregister(&entry->kobj); kobject_unregister(&entry->kobj);
} }
@ -704,7 +711,7 @@ pdc_stable_init(void)
/* For now we'll register the pdc subsys within this driver */ /* For now we'll register the pdc subsys within this driver */
if ((rc = firmware_register(&pdc_subsys))) if ((rc = firmware_register(&pdc_subsys)))
return rc; goto fail_firmreg;
/* Don't forget the info entry */ /* Don't forget the info entry */
for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++) for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++)
@ -713,12 +720,25 @@ pdc_stable_init(void)
/* register the paths subsys as a subsystem of pdc subsys */ /* register the paths subsys as a subsystem of pdc subsys */
kset_set_kset_s(&paths_subsys, pdc_subsys); kset_set_kset_s(&paths_subsys, pdc_subsys);
subsystem_register(&paths_subsys); if ((rc= subsystem_register(&paths_subsys)))
goto fail_subsysreg;
/* now we create all "files" for the paths subsys */ /* now we create all "files" for the paths subsys */
pdcs_register_pathentries(); if ((rc = pdcs_register_pathentries()))
goto fail_pdcsreg;
return 0; return rc;
fail_pdcsreg:
pdcs_unregister_pathentries();
subsystem_unregister(&paths_subsys);
fail_subsysreg:
firmware_unregister(&pdc_subsys);
fail_firmreg:
printk(KERN_INFO "PDC Stable Storage bailing out\n");
return rc;
} }
static void __exit static void __exit

View File

@ -2,7 +2,7 @@
* linux/arch/parisc/kernel/power.c * linux/arch/parisc/kernel/power.c
* HP PARISC soft power switch support driver * HP PARISC soft power switch support driver
* *
* Copyright (c) 2001-2002 Helge Deller <deller@gmx.de> * Copyright (c) 2001-2005 Helge Deller <deller@gmx.de>
* All rights reserved. * All rights reserved.
* *
* *
@ -102,7 +102,7 @@ static DECLARE_WORK(poweroff_work, deferred_poweroff, NULL);
static void poweroff(void) static void poweroff(void)
{ {
static int powering_off; static int powering_off __read_mostly;
if (powering_off) if (powering_off)
return; return;
@ -113,7 +113,7 @@ static void poweroff(void)
/* local time-counter for shutdown */ /* local time-counter for shutdown */
static int shutdown_timer; static int shutdown_timer __read_mostly;
/* check, give feedback and start shutdown after one second */ /* check, give feedback and start shutdown after one second */
static void process_shutdown(void) static void process_shutdown(void)
@ -139,7 +139,7 @@ static void process_shutdown(void)
DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0); DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0);
/* soft power switch enabled/disabled */ /* soft power switch enabled/disabled */
int pwrsw_enabled = 1; int pwrsw_enabled __read_mostly = 1;
/* /*
* On gecko style machines (e.g. 712/xx and 715/xx) * On gecko style machines (e.g. 712/xx and 715/xx)
@ -149,7 +149,7 @@ int pwrsw_enabled = 1;
*/ */
static void gecko_tasklet_func(unsigned long unused) static void gecko_tasklet_func(unsigned long unused)
{ {
if (!pwrsw_enabled) if (unlikely(!pwrsw_enabled))
return; return;
if (__getDIAG(25) & 0x80000000) { if (__getDIAG(25) & 0x80000000) {
@ -173,7 +173,7 @@ static void polling_tasklet_func(unsigned long soft_power_reg)
{ {
unsigned long current_status; unsigned long current_status;
if (!pwrsw_enabled) if (unlikely(!pwrsw_enabled))
return; return;
current_status = gsc_readl(soft_power_reg); current_status = gsc_readl(soft_power_reg);

View File

@ -121,6 +121,7 @@ config PARPORT_GSC
tristate tristate
default GSC default GSC
depends on PARPORT depends on PARPORT
select PARPORT_NOT_PC
config PARPORT_SUNBPP config PARPORT_SUNBPP
tristate "Sparc hardware (EXPERIMENTAL)" tristate "Sparc hardware (EXPERIMENTAL)"

View File

@ -3,7 +3,7 @@
* Low level Frame buffer driver for HP workstations with * Low level Frame buffer driver for HP workstations with
* STI (standard text interface) video firmware. * STI (standard text interface) video firmware.
* *
* Copyright (C) 2001-2004 Helge Deller <deller@gmx.de> * Copyright (C) 2001-2005 Helge Deller <deller@gmx.de>
* Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de> * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
* *
* Based on: * Based on:
@ -73,16 +73,13 @@
#include "sticore.h" #include "sticore.h"
/* REGION_BASE(fb_info, index) returns the virtual address for region <index> */ /* REGION_BASE(fb_info, index) returns the virtual address for region <index> */
#ifdef __LP64__
#define REGION_BASE(fb_info, index) \ #define REGION_BASE(fb_info, index) \
(fb_info->sti->glob_cfg->region_ptrs[index] | 0xffffffff00000000) F_EXTEND(fb_info->sti->glob_cfg->region_ptrs[index])
#else
#define REGION_BASE(fb_info, index) \
fb_info->sti->glob_cfg->region_ptrs[index]
#endif
#define NGLEDEVDEPROM_CRT_REGION 1 #define NGLEDEVDEPROM_CRT_REGION 1
#define NR_PALETTE 256
typedef struct { typedef struct {
__s32 video_config_reg; __s32 video_config_reg;
__s32 misc_video_start; __s32 misc_video_start;
@ -112,7 +109,7 @@ struct stifb_info {
ngle_rom_t ngle_rom; ngle_rom_t ngle_rom;
struct sti_struct *sti; struct sti_struct *sti;
int deviceSpecificConfig; int deviceSpecificConfig;
u32 pseudo_palette[256]; u32 pseudo_palette[16];
}; };
static int __initdata stifb_bpp_pref[MAX_STI_ROMS]; static int __initdata stifb_bpp_pref[MAX_STI_ROMS];
@ -995,7 +992,7 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
struct stifb_info *fb = (struct stifb_info *) info; struct stifb_info *fb = (struct stifb_info *) info;
u32 color; u32 color;
if (regno >= 256) /* no. of hw registers */ if (regno >= NR_PALETTE)
return 1; return 1;
red >>= 8; red >>= 8;
@ -1006,7 +1003,7 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
START_IMAGE_COLORMAP_ACCESS(fb); START_IMAGE_COLORMAP_ACCESS(fb);
if (fb->info.var.grayscale) { if (unlikely(fb->info.var.grayscale)) {
/* gray = 0.30*R + 0.59*G + 0.11*B */ /* gray = 0.30*R + 0.59*G + 0.11*B */
color = ((red * 77) + color = ((red * 77) +
(green * 151) + (green * 151) +
@ -1017,13 +1014,13 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
(blue)); (blue));
} }
if (info->var.bits_per_pixel == 32) { if (fb->info.fix.visual == FB_VISUAL_DIRECTCOLOR) {
((u32 *)(info->pseudo_palette))[regno] = struct fb_var_screeninfo *var = &fb->info.var;
(red << info->var.red.offset) | if (regno < 16)
(green << info->var.green.offset) | ((u32 *)fb->info.pseudo_palette)[regno] =
(blue << info->var.blue.offset); regno << var->red.offset |
} else { regno << var->green.offset |
((u32 *)(info->pseudo_palette))[regno] = regno; regno << var->blue.offset;
} }
WRITE_IMAGE_COLOR(fb, regno, color); WRITE_IMAGE_COLOR(fb, regno, color);
@ -1066,9 +1063,9 @@ stifb_blank(int blank_mode, struct fb_info *info)
case S9000_ID_HCRX: case S9000_ID_HCRX:
HYPER_ENABLE_DISABLE_DISPLAY(fb, enable); HYPER_ENABLE_DISABLE_DISPLAY(fb, enable);
break; break;
case S9000_ID_A1659A:; /* fall through */ case S9000_ID_A1659A: /* fall through */
case S9000_ID_TIMBER:; case S9000_ID_TIMBER:
case CRX24_OVERLAY_PLANES:; case CRX24_OVERLAY_PLANES:
default: default:
ENABLE_DISABLE_DISPLAY(fb, enable); ENABLE_DISABLE_DISPLAY(fb, enable);
break; break;
@ -1250,12 +1247,10 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
memset(&fb->ngle_rom, 0, sizeof(fb->ngle_rom)); memset(&fb->ngle_rom, 0, sizeof(fb->ngle_rom));
if ((fb->sti->regions_phys[0] & 0xfc000000) == if ((fb->sti->regions_phys[0] & 0xfc000000) ==
(fb->sti->regions_phys[2] & 0xfc000000)) (fb->sti->regions_phys[2] & 0xfc000000))
sti_rom_address = fb->sti->regions_phys[0]; sti_rom_address = F_EXTEND(fb->sti->regions_phys[0]);
else else
sti_rom_address = fb->sti->regions_phys[1]; sti_rom_address = F_EXTEND(fb->sti->regions_phys[1]);
#ifdef __LP64__
sti_rom_address |= 0xffffffff00000000;
#endif
fb->deviceSpecificConfig = gsc_readl(sti_rom_address); fb->deviceSpecificConfig = gsc_readl(sti_rom_address);
if (IS_24_DEVICE(fb)) { if (IS_24_DEVICE(fb)) {
if (bpp_pref == 8 || bpp_pref == 32) if (bpp_pref == 8 || bpp_pref == 32)
@ -1315,7 +1310,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
break; break;
case 32: case 32:
fix->type = FB_TYPE_PACKED_PIXELS; fix->type = FB_TYPE_PACKED_PIXELS;
fix->visual = FB_VISUAL_TRUECOLOR; fix->visual = FB_VISUAL_DIRECTCOLOR;
var->red.length = var->green.length = var->blue.length = var->transp.length = 8; var->red.length = var->green.length = var->blue.length = var->transp.length = 8;
var->blue.offset = 0; var->blue.offset = 0;
var->green.offset = 8; var->green.offset = 8;
@ -1337,7 +1332,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
info->pseudo_palette = &fb->pseudo_palette; info->pseudo_palette = &fb->pseudo_palette;
/* This has to been done !!! */ /* This has to been done !!! */
fb_alloc_cmap(&info->cmap, 256, 0); fb_alloc_cmap(&info->cmap, NR_PALETTE, 0);
stifb_init_display(fb); stifb_init_display(fb);
if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) { if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) {
@ -1488,7 +1483,3 @@ module_exit(stifb_cleanup);
MODULE_AUTHOR("Helge Deller <deller@gmx.de>, Thomas Bogendoerfer <tsbogend@alpha.franken.de>"); MODULE_AUTHOR("Helge Deller <deller@gmx.de>, Thomas Bogendoerfer <tsbogend@alpha.franken.de>");
MODULE_DESCRIPTION("Framebuffer driver for HP's NGLE series graphics cards in HP PARISC machines"); MODULE_DESCRIPTION("Framebuffer driver for HP's NGLE series graphics cards in HP PARISC machines");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_PARM(bpp, "i");
MODULE_PARM_DESC(mem, "Bits per pixel (default: 8)");

View File

@ -29,14 +29,14 @@
#define SMP_CACHE_BYTES L1_CACHE_BYTES #define SMP_CACHE_BYTES L1_CACHE_BYTES
extern void flush_data_cache_local(void); /* flushes local data-cache only */ extern void flush_data_cache_local(void *); /* flushes local data-cache only */
extern void flush_instruction_cache_local(void); /* flushes local code-cache only */ extern void flush_instruction_cache_local(void *); /* flushes local code-cache only */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void flush_data_cache(void); /* flushes data-cache only (all processors) */ extern void flush_data_cache(void); /* flushes data-cache only (all processors) */
extern void flush_instruction_cache(void); /* flushes i-cache only (all processors) */ extern void flush_instruction_cache(void); /* flushes i-cache only (all processors) */
#else #else
#define flush_data_cache flush_data_cache_local #define flush_data_cache() flush_data_cache_local(NULL)
#define flush_instruction_cache flush_instruction_cache_local #define flush_instruction_cache() flush_instruction_cache_local(NULL)
#endif #endif
extern void parisc_cache_init(void); /* initializes cache-flushing */ extern void parisc_cache_init(void); /* initializes cache-flushing */

View File

@ -41,7 +41,7 @@ extern void __raw_bad_addr(const volatile void __iomem *addr);
#define __raw_check_addr(addr) \ #define __raw_check_addr(addr) \
if (((unsigned long)addr >> NYBBLE_SHIFT) != 0xe) \ if (((unsigned long)addr >> NYBBLE_SHIFT) != 0xe) \
__raw_bad_addr(addr); \ __raw_bad_addr(addr); \
addr = (void *)((unsigned long)addr | (0xfUL << NYBBLE_SHIFT)); addr = (void __iomem *)((unsigned long)addr | (0xfUL << NYBBLE_SHIFT));
#else #else
#define gsc_check_addr(addr) #define gsc_check_addr(addr)
#define __raw_check_addr(addr) #define __raw_check_addr(addr)

View File

@ -135,6 +135,13 @@ extern int npmem_ranges;
#define pfn_valid(pfn) ((pfn) < max_mapnr) #define pfn_valid(pfn) ((pfn) < max_mapnr)
#endif /* CONFIG_DISCONTIGMEM */ #endif /* CONFIG_DISCONTIGMEM */
#ifdef CONFIG_HUGETLB_PAGE
#define HPAGE_SHIFT 22 /* 4MB (is this fixed?) */
#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
#define HPAGE_MASK (~(HPAGE_SIZE - 1))
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
#endif
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)

View File

@ -84,11 +84,17 @@ static __inline__ int pci_is_lmmio(struct pci_hba_data *hba, unsigned long a)
/* /*
** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses. ** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses.
** See pcibios.c for more conversions used by Generic PCI code. ** See pcibios.c for more conversions used by Generic PCI code.
**
** Platform characteristics/firmware guarantee that
** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO
** (2) PA_VIEW == IO_VIEW for GMMIO
*/ */
#define PCI_BUS_ADDR(hba,a) (PCI_IS_LMMIO(hba,a) \ #define PCI_BUS_ADDR(hba,a) (PCI_IS_LMMIO(hba,a) \
? ((a) - hba->lmmio_space_offset) /* mangle LMMIO */ \ ? ((a) - hba->lmmio_space_offset) /* mangle LMMIO */ \
: (a)) /* GMMIO */ : (a)) /* GMMIO */
#define PCI_HOST_ADDR(hba,a) ((a) + hba->lmmio_space_offset) #define PCI_HOST_ADDR(hba,a) (((a) & PCI_F_EXTEND) == 0 \
? (a) + hba->lmmio_space_offset \
: (a))
#else /* !CONFIG_64BIT */ #else /* !CONFIG_64BIT */

View File

@ -144,16 +144,16 @@ struct thread_struct {
}) })
#define INIT_THREAD { \ #define INIT_THREAD { \
regs: { gr: { 0, }, \ .regs = { .gr = { 0, }, \
fr: { 0, }, \ .fr = { 0, }, \
sr: { 0, }, \ .sr = { 0, }, \
iasq: { 0, }, \ .iasq = { 0, }, \
iaoq: { 0, }, \ .iaoq = { 0, }, \
cr27: 0, \ .cr27 = 0, \
}, \ }, \
task_size: DEFAULT_TASK_SIZE, \ .task_size = DEFAULT_TASK_SIZE, \
map_base: DEFAULT_MAP_BASE, \ .map_base = DEFAULT_MAP_BASE, \
flags: 0 \ .flags = 0 \
} }
/* /*

View File

@ -22,6 +22,7 @@ extern spinlock_t pa_tlb_lock;
#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
extern void flush_tlb_all(void); extern void flush_tlb_all(void);
extern void flush_tlb_all_local(void *);
/* /*
* flush_tlb_mm() * flush_tlb_mm()

View File

@ -13,7 +13,7 @@
#define SMP_CACHE_BYTES L1_CACHE_BYTES #define SMP_CACHE_BYTES L1_CACHE_BYTES
#endif #endif
#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64) #if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC)
#define __read_mostly __attribute__((__section__(".data.read_mostly"))) #define __read_mostly __attribute__((__section__(".data.read_mostly")))
#else #else
#define __read_mostly #define __read_mostly

View File

@ -1236,7 +1236,7 @@ harmony_driver_probe(struct parisc_device *dev)
} }
/* Set the HPA of harmony */ /* Set the HPA of harmony */
harmony.hpa = (struct harmony_hpa *)dev->hpa; harmony.hpa = (struct harmony_hpa *)dev->hpa.start;
harmony.dev = dev; harmony.dev = dev;
/* Grab the ID and revision from the device */ /* Grab the ID and revision from the device */
@ -1250,7 +1250,7 @@ harmony_driver_probe(struct parisc_device *dev)
printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", " printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", "
"h/w id %i, rev. %i at 0x%lx, IRQ %i\n", "h/w id %i, rev. %i at 0x%lx, IRQ %i\n",
id, rev, dev->hpa, harmony.dev->irq); id, rev, dev->hpa.start, harmony.dev->irq);
/* Make sure the control bit isn't set, although I don't think it /* Make sure the control bit isn't set, although I don't think it
ever is. */ ever is. */