Merge branch 'parisc-5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc updates from Helge Deller: "The most important changes in this patch set are: - DMA-related cleanups for parisc with the aim to move anything not required by drivers out of <asm/dma-mapping.h>, by Christoph Hellwig - Switch to memblock_alloc(), by Mike Rapoport - Makefile cleanups by Masahiro Yamada - Switch to bust_spinlocks(), by Sergey Senozhatsky - Improved initial SMP affinity selection for IRQs - Added IPI- and rescheduling interrupts in /proc/interrupts output" * 'parisc-5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: (21 commits) parisc: use memblock_alloc() instead of custom get_memblock() parisc: Add constants for various PDC firmware calls parisc: Add constant for PDC_PAT_COMPLEX firmware call parisc: Show machine product number during boot parisc: Add constants for PDC_RELOCATE PDC call parisc: Add PDC_CRASH_PREP PDC function number parisc: Use F_EXTEND() macro in iosapic code parisc: remove the HBA_DATA macro parisc/lba_pci: use container_of in LBA_DEV parisc/dino: use container_of in DINO_DEV parisc: properly type the return value of parisc_walk_tree parisc: properly type the iommu field in struct pci_hba_data parisc: turn GET_IOC into an inline function parisc: move internal implementation details out of <asm/dma-mapping.h> parisc: don't include <asm/cacheflush.h> in <asm/dma-mapping.h> parisc: remove meaningless ccflags-y in arch/parisc/boot/Makefile parisc: replace oops_in_progress manipulation with bust_spinlocks() parisc: Improve initial IRQ to CPU assignment parisc: Count IPI function call interrupts parisc: Show rescheduling interrupts on SMP machines only ...
This commit is contained in:
Коммит
8feed3efa8
|
@ -2,12 +2,6 @@
|
|||
# Makefile for the linux parisc-specific parts of the boot image creator.
|
||||
#
|
||||
|
||||
COMPILE_VERSION := __linux_compile_version_id__`hostname | \
|
||||
tr -c '[0-9A-Za-z]' '_'`__`date | \
|
||||
tr -c '[0-9A-Za-z]' '_'`_t
|
||||
|
||||
ccflags-y := -DCOMPILE_VERSION=$(COMPILE_VERSION) -gstabs -I.
|
||||
|
||||
targets := image
|
||||
targets += bzImage
|
||||
subdir- := compressed
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
#ifndef _PARISC_DMA_MAPPING_H
|
||||
#define _PARISC_DMA_MAPPING_H
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
/*
|
||||
** We need to support 4 different coherent dma models with one binary:
|
||||
**
|
||||
|
@ -28,48 +26,4 @@ static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
|
|||
return hppa_dma_ops;
|
||||
}
|
||||
|
||||
static inline void *
|
||||
parisc_walk_tree(struct device *dev)
|
||||
{
|
||||
struct device *otherdev;
|
||||
if(likely(dev->platform_data != NULL))
|
||||
return dev->platform_data;
|
||||
/* OK, just traverse the bus to find it */
|
||||
for(otherdev = dev->parent; otherdev;
|
||||
otherdev = otherdev->parent) {
|
||||
if(otherdev->platform_data) {
|
||||
dev->platform_data = otherdev->platform_data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return dev->platform_data;
|
||||
}
|
||||
|
||||
#define GET_IOC(dev) ({ \
|
||||
void *__pdata = parisc_walk_tree(dev); \
|
||||
__pdata ? HBA_DATA(__pdata)->iommu : NULL; \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_IOMMU_CCIO
|
||||
struct parisc_device;
|
||||
struct ioc;
|
||||
void * ccio_get_iommu(const struct parisc_device *dev);
|
||||
int ccio_request_resource(const struct parisc_device *dev,
|
||||
struct resource *res);
|
||||
int ccio_allocate_resource(const struct parisc_device *dev,
|
||||
struct resource *res, unsigned long size,
|
||||
unsigned long min, unsigned long max, unsigned long align);
|
||||
#else /* !CONFIG_IOMMU_CCIO */
|
||||
#define ccio_get_iommu(dev) NULL
|
||||
#define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res)
|
||||
#define ccio_allocate_resource(dev, res, size, min, max, align) \
|
||||
allocate_resource(&iomem_resource, res, size, min, max, \
|
||||
align, NULL, NULL)
|
||||
#endif /* !CONFIG_IOMMU_CCIO */
|
||||
|
||||
#ifdef CONFIG_IOMMU_SBA
|
||||
struct parisc_device;
|
||||
void * sba_get_iommu(struct parisc_device *dev);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -22,6 +22,7 @@ typedef struct {
|
|||
unsigned int irq_stack_usage;
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned int irq_resched_count;
|
||||
unsigned int irq_call_count;
|
||||
#endif
|
||||
unsigned int irq_unaligned_count;
|
||||
unsigned int irq_fpassist_count;
|
||||
|
|
|
@ -56,7 +56,7 @@ struct pci_hba_data {
|
|||
#define DINO_MAX_LMMIO_RESOURCES 3
|
||||
|
||||
unsigned long lmmio_space_offset; /* CPU view - PCI view */
|
||||
void * iommu; /* IOMMU this device is under */
|
||||
struct ioc *iommu; /* IOMMU this device is under */
|
||||
/* REVISIT - spinlock to protect resources? */
|
||||
|
||||
#define HBA_NAME_SIZE 16
|
||||
|
@ -66,8 +66,6 @@ struct pci_hba_data {
|
|||
char gmmio_name[HBA_NAME_SIZE];
|
||||
};
|
||||
|
||||
#define HBA_DATA(d) ((struct pci_hba_data *) (d))
|
||||
|
||||
/*
|
||||
** We support 2^16 I/O ports per HBA. These are set up in the form
|
||||
** 0xbbxxxx, where bb is the bus number and xxxx is the I/O port
|
||||
|
|
|
@ -44,6 +44,7 @@ int pdc_model_sysmodel(char *name);
|
|||
int pdc_model_cpuid(unsigned long *cpu_id);
|
||||
int pdc_model_versions(unsigned long *versions, int id);
|
||||
int pdc_model_capabilities(unsigned long *capabilities);
|
||||
int pdc_model_platform_info(char *orig_prod_num, char *current_prod_num, char *serial_no);
|
||||
int pdc_cache_info(struct pdc_cache_info *cache);
|
||||
int pdc_spaceid_bits(unsigned long *space_bits);
|
||||
#ifndef CONFIG_PA20
|
||||
|
|
|
@ -67,6 +67,10 @@
|
|||
#define PDC_PAT_CHASSIS_READ_LOG 1L /* Read Log Entry */
|
||||
|
||||
|
||||
/* PDC PAT COMPLEX */
|
||||
|
||||
#define PDC_PAT_COMPLEX 66L
|
||||
|
||||
/* PDC PAT CPU -- CPU configuration within the protection domain */
|
||||
|
||||
#define PDC_PAT_CPU 67L
|
||||
|
|
|
@ -60,6 +60,8 @@
|
|||
#define PDC_MODEL_NVA_UNSUPPORTED (3 << 4)
|
||||
#define PDC_MODEL_GET_BOOT__OP 8 /* returns boot test options */
|
||||
#define PDC_MODEL_SET_BOOT__OP 9 /* set boot test options */
|
||||
#define PDC_MODEL_GET_PLATFORM_INFO 10 /* returns platform info */
|
||||
#define PDC_MODEL_GET_INSTALL_KERNEL 11 /* returns kernel for installation */
|
||||
|
||||
#define PA89_INSTRUCTION_SET 0x4 /* capabilities returned */
|
||||
#define PA90_INSTRUCTION_SET 0x8
|
||||
|
@ -99,7 +101,7 @@
|
|||
#define PDC_TOD 9 /* time-of-day clock (TOD) */
|
||||
#define PDC_TOD_READ 0 /* read TOD */
|
||||
#define PDC_TOD_WRITE 1 /* write TOD */
|
||||
|
||||
#define PDC_TOD_CALIBRATE 2 /* calibrate timers */
|
||||
|
||||
#define PDC_STABLE 10 /* stable storage (sprockets) */
|
||||
#define PDC_STABLE_READ 0
|
||||
|
@ -109,15 +111,22 @@
|
|||
#define PDC_STABLE_INITIALIZE 4
|
||||
|
||||
#define PDC_NVOLATILE 11 /* often not implemented */
|
||||
#define PDC_NVOLATILE_READ 0
|
||||
#define PDC_NVOLATILE_WRITE 1
|
||||
#define PDC_NVOLATILE_RETURN_SIZE 2
|
||||
#define PDC_NVOLATILE_VERIFY_CONTENTS 3
|
||||
#define PDC_NVOLATILE_INITIALIZE 4
|
||||
|
||||
#define PDC_ADD_VALID 12 /* Memory validation PDC call */
|
||||
#define PDC_ADD_VALID_VERIFY 0 /* Make PDC_ADD_VALID verify region */
|
||||
|
||||
#define PDC_DEBUG 14 /* Obsolete */
|
||||
|
||||
#define PDC_INSTR 15 /* get instr to invoke PDCE_CHECK() */
|
||||
|
||||
#define PDC_PROC 16 /* (sprockets) */
|
||||
|
||||
#define PDC_CONFIG 16 /* (sprockets) */
|
||||
#define PDC_CONFIG 17 /* (sprockets) */
|
||||
#define PDC_CONFIG_DECONFIG 0
|
||||
#define PDC_CONFIG_DRECONFIG 1
|
||||
#define PDC_CONFIG_DRETURN_CONFIG 2
|
||||
|
@ -167,6 +176,15 @@
|
|||
#define PDC_SOFT_POWER_INFO 0 /* return info about the soft power switch */
|
||||
#define PDC_SOFT_POWER_ENABLE 1 /* enable/disable soft power switch */
|
||||
|
||||
#define PDC_ALLOC 24 /* allocate static storage for PDC & IODC */
|
||||
|
||||
#define PDC_CRASH_PREP 25 /* Prepare system for crash dump */
|
||||
#define PDC_CRASH_DUMP 0 /* Do platform specific preparations for dump */
|
||||
#define PDC_CRASH_LOG_CEC_ERROR 1 /* Dump hardware registers */
|
||||
|
||||
#define PDC_SCSI_PARMS 26 /* Get and set SCSI parameters */
|
||||
#define PDC_SCSI_GET_PARMS 0 /* Get SCSI parameters for I/O device */
|
||||
#define PDC_SCSI_SET_PARMS 1 /* Set SCSI parameters for I/O device */
|
||||
|
||||
/* HVERSION dependent */
|
||||
|
||||
|
@ -260,6 +278,10 @@
|
|||
#define PDC_PCI_READ_MON_TYPE 15
|
||||
#define PDC_PCI_WRITE_MON_TYPE 16
|
||||
|
||||
#define PDC_RELOCATE 149 /* (sprockets) */
|
||||
#define PDC_RELOCATE_GET_RELOCINFO 0
|
||||
#define PDC_RELOCATE_CHECKSUM 1
|
||||
#define PDC_RELOCATE_RELOCATE 2
|
||||
|
||||
/* Get SCSI Interface Card info: SDTR, SCSI ID, mode (SE vs LVD) */
|
||||
#define PDC_INITIATOR 163
|
||||
|
|
|
@ -568,6 +568,30 @@ int pdc_model_capabilities(unsigned long *capabilities)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_model_platform_info - Returns machine product and serial number.
|
||||
* @orig_prod_num: Return buffer for original product number.
|
||||
* @current_prod_num: Return buffer for current product number.
|
||||
* @serial_no: Return buffer for serial number.
|
||||
*
|
||||
* Returns strings containing the original and current product numbers and the
|
||||
* serial number of the system.
|
||||
*/
|
||||
int pdc_model_platform_info(char *orig_prod_num, char *current_prod_num,
|
||||
char *serial_no)
|
||||
{
|
||||
int retval;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&pdc_lock, flags);
|
||||
retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_GET_PLATFORM_INFO,
|
||||
__pa(orig_prod_num), __pa(current_prod_num), __pa(serial_no));
|
||||
convert_to_wide(pdc_result);
|
||||
spin_unlock_irqrestore(&pdc_lock, flags);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_cache_info - Return cache and TLB information.
|
||||
* @cache_info: The return buffer.
|
||||
|
|
|
@ -117,7 +117,10 @@ int cpu_check_affinity(struct irq_data *d, const struct cpumask *dest)
|
|||
return -EINVAL;
|
||||
|
||||
/* whatever mask they set, we just allow one CPU */
|
||||
cpu_dest = cpumask_first_and(dest, cpu_online_mask);
|
||||
cpu_dest = cpumask_next_and(d->irq & (num_online_cpus()-1),
|
||||
dest, cpu_online_mask);
|
||||
if (cpu_dest >= nr_cpu_ids)
|
||||
cpu_dest = cpumask_first_and(dest, cpu_online_mask);
|
||||
|
||||
return cpu_dest;
|
||||
}
|
||||
|
@ -175,10 +178,16 @@ int arch_show_interrupts(struct seq_file *p, int prec)
|
|||
# endif
|
||||
#endif
|
||||
#ifdef CONFIG_SMP
|
||||
seq_printf(p, "%*s: ", prec, "RES");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", irq_stats(j)->irq_resched_count);
|
||||
seq_puts(p, " Rescheduling interrupts\n");
|
||||
if (num_online_cpus() > 1) {
|
||||
seq_printf(p, "%*s: ", prec, "RES");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", irq_stats(j)->irq_resched_count);
|
||||
seq_puts(p, " Rescheduling interrupts\n");
|
||||
seq_printf(p, "%*s: ", prec, "CAL");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", irq_stats(j)->irq_call_count);
|
||||
seq_puts(p, " Function call interrupts\n");
|
||||
}
|
||||
#endif
|
||||
seq_printf(p, "%*s: ", prec, "UAH");
|
||||
for_each_online_cpu(j)
|
||||
|
|
|
@ -242,6 +242,7 @@ static int __init processor_probe(struct parisc_device *dev)
|
|||
void __init collect_boot_cpu_data(void)
|
||||
{
|
||||
unsigned long cr16_seed;
|
||||
char orig_prod_num[64], current_prod_num[64], serial_no[64];
|
||||
|
||||
memset(&boot_cpu_data, 0, sizeof(boot_cpu_data));
|
||||
|
||||
|
@ -301,6 +302,14 @@ void __init collect_boot_cpu_data(void)
|
|||
_parisc_requires_coherency = (boot_cpu_data.cpu_type == mako) ||
|
||||
(boot_cpu_data.cpu_type == mako2);
|
||||
#endif
|
||||
|
||||
if (pdc_model_platform_info(orig_prod_num, current_prod_num, serial_no) == PDC_OK) {
|
||||
printk(KERN_INFO "product %s, original product %s, S/N: %s\n",
|
||||
current_prod_num, orig_prod_num, serial_no);
|
||||
add_device_randomness(orig_prod_num, strlen(orig_prod_num));
|
||||
add_device_randomness(current_prod_num, strlen(current_prod_num));
|
||||
add_device_randomness(serial_no, strlen(serial_no));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <linux/sched/clock.h>
|
||||
#include <linux/start_kernel.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/pdc.h>
|
||||
|
|
|
@ -155,6 +155,7 @@ ipi_interrupt(int irq, void *dev_id)
|
|||
|
||||
case IPI_CALL_FUNC:
|
||||
smp_debug(100, KERN_DEBUG "CPU%d IPI_CALL_FUNC\n", this_cpu);
|
||||
inc_irq_stat(irq_call_count);
|
||||
generic_smp_call_function_interrupt();
|
||||
break;
|
||||
|
||||
|
|
|
@ -218,7 +218,7 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err)
|
|||
return;
|
||||
}
|
||||
|
||||
oops_in_progress = 1;
|
||||
bust_spinlocks(1);
|
||||
|
||||
oops_enter();
|
||||
|
||||
|
@ -396,7 +396,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o
|
|||
{
|
||||
static DEFINE_SPINLOCK(terminate_lock);
|
||||
|
||||
oops_in_progress = 1;
|
||||
bust_spinlocks(1);
|
||||
|
||||
set_eiem(0);
|
||||
local_irq_disable();
|
||||
|
|
|
@ -79,36 +79,6 @@ static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;
|
|||
physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly;
|
||||
int npmem_ranges __read_mostly;
|
||||
|
||||
/*
|
||||
* get_memblock() allocates pages via memblock.
|
||||
* We can't use memblock_find_in_range(0, KERNEL_INITIAL_SIZE) here since it
|
||||
* doesn't allocate from bottom to top which is needed because we only created
|
||||
* the initial mapping up to KERNEL_INITIAL_SIZE in the assembly bootup code.
|
||||
*/
|
||||
static void * __init get_memblock(unsigned long size)
|
||||
{
|
||||
static phys_addr_t search_addr __initdata;
|
||||
phys_addr_t phys;
|
||||
|
||||
if (!search_addr)
|
||||
search_addr = PAGE_ALIGN(__pa((unsigned long) &_end));
|
||||
search_addr = ALIGN(search_addr, size);
|
||||
while (!memblock_is_region_memory(search_addr, size) ||
|
||||
memblock_is_region_reserved(search_addr, size)) {
|
||||
search_addr += size;
|
||||
}
|
||||
phys = search_addr;
|
||||
|
||||
if (phys)
|
||||
memblock_reserve(phys, size);
|
||||
else
|
||||
panic("get_memblock() failed.\n");
|
||||
|
||||
memset(__va(phys), 0, size);
|
||||
|
||||
return __va(phys);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define MAX_MEM (~0UL)
|
||||
#else /* !CONFIG_64BIT */
|
||||
|
@ -321,6 +291,13 @@ static void __init setup_bootmem(void)
|
|||
max_pfn = start_pfn + npages;
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't use memblock top-down allocations because we only
|
||||
* created the initial mapping up to KERNEL_INITIAL_SIZE in
|
||||
* the assembly bootup code.
|
||||
*/
|
||||
memblock_set_bottom_up(true);
|
||||
|
||||
/* 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.
|
||||
|
@ -442,7 +419,10 @@ static void __init map_pages(unsigned long start_vaddr,
|
|||
*/
|
||||
|
||||
if (!pmd) {
|
||||
pmd = (pmd_t *) get_memblock(PAGE_SIZE << PMD_ORDER);
|
||||
pmd = memblock_alloc(PAGE_SIZE << PMD_ORDER,
|
||||
PAGE_SIZE << PMD_ORDER);
|
||||
if (!pmd)
|
||||
panic("pmd allocation failed.\n");
|
||||
pmd = (pmd_t *) __pa(pmd);
|
||||
}
|
||||
|
||||
|
@ -461,7 +441,10 @@ static void __init map_pages(unsigned long start_vaddr,
|
|||
|
||||
pg_table = (pte_t *)pmd_address(*pmd);
|
||||
if (!pg_table) {
|
||||
pg_table = (pte_t *) get_memblock(PAGE_SIZE);
|
||||
pg_table = memblock_alloc(PAGE_SIZE,
|
||||
PAGE_SIZE);
|
||||
if (!pg_table)
|
||||
panic("page table allocation failed\n");
|
||||
pg_table = (pte_t *) __pa(pg_table);
|
||||
}
|
||||
|
||||
|
@ -700,7 +683,10 @@ static void __init pagetable_init(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
empty_zero_page = get_memblock(PAGE_SIZE);
|
||||
empty_zero_page = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
if (!empty_zero_page)
|
||||
panic("zero page allocation failed.\n");
|
||||
|
||||
}
|
||||
|
||||
static void __init gateway_init(void)
|
||||
|
|
|
@ -55,6 +55,8 @@
|
|||
#include <asm/hardware.h> /* for register_module() */
|
||||
#include <asm/parisc-device.h>
|
||||
|
||||
#include "iommu.h"
|
||||
|
||||
/*
|
||||
** Choose "ccio" since that's what HP-UX calls it.
|
||||
** Make it easier for folks to migrate from one to the other :^)
|
||||
|
@ -1517,6 +1519,7 @@ static int __init ccio_probe(struct parisc_device *dev)
|
|||
{
|
||||
int i;
|
||||
struct ioc *ioc, **ioc_p = &ioc_list;
|
||||
struct pci_hba_data *hba;
|
||||
|
||||
ioc = kzalloc(sizeof(struct ioc), GFP_KERNEL);
|
||||
if (ioc == NULL) {
|
||||
|
@ -1543,11 +1546,13 @@ static int __init ccio_probe(struct parisc_device *dev)
|
|||
ccio_ioc_init(ioc);
|
||||
ccio_init_resources(ioc);
|
||||
hppa_dma_ops = &ccio_ops;
|
||||
dev->dev.platform_data = kzalloc(sizeof(struct pci_hba_data), GFP_KERNEL);
|
||||
|
||||
hba = kzalloc(sizeof(*hba), GFP_KERNEL);
|
||||
/* if this fails, no I/O cards will work, so may as well bug */
|
||||
BUG_ON(dev->dev.platform_data == NULL);
|
||||
HBA_DATA(dev->dev.platform_data)->iommu = ioc;
|
||||
BUG_ON(hba == NULL);
|
||||
|
||||
hba->iommu = ioc;
|
||||
dev->dev.platform_data = hba;
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
if (ioc_count == 0) {
|
||||
|
|
|
@ -59,6 +59,7 @@
|
|||
#include <asm/hardware.h>
|
||||
|
||||
#include "gsc.h"
|
||||
#include "iommu.h"
|
||||
|
||||
#undef DINO_DEBUG
|
||||
|
||||
|
@ -153,12 +154,10 @@ struct dino_device
|
|||
#endif
|
||||
};
|
||||
|
||||
/* Looks nice and keeps the compiler happy */
|
||||
#define DINO_DEV(d) ({ \
|
||||
void *__pdata = d; \
|
||||
BUG_ON(!__pdata); \
|
||||
(struct dino_device *)__pdata; })
|
||||
|
||||
static inline struct dino_device *DINO_DEV(struct pci_hba_data *hba)
|
||||
{
|
||||
return container_of(hba, struct dino_device, hba);
|
||||
}
|
||||
|
||||
/*
|
||||
* Dino Configuration Space Accessor Functions
|
||||
|
|
|
@ -45,6 +45,8 @@
|
|||
#include <asm/eisa_bus.h>
|
||||
#include <asm/eisa_eeprom.h>
|
||||
|
||||
#include "iommu.h"
|
||||
|
||||
#if 0
|
||||
#define EISA_DBG(msg, arg...) printk(KERN_DEBUG "eisa: " msg, ## arg)
|
||||
#else
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
#include <asm/hardware.h>
|
||||
#include <asm/parisc-device.h>
|
||||
|
||||
#include "iommu.h"
|
||||
|
||||
struct hppb_card {
|
||||
unsigned long hpa;
|
||||
struct resource mmio_region;
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
#ifndef _IOMMU_H
|
||||
#define _IOMMU_H 1
|
||||
|
||||
#include <linux/pci.h>
|
||||
|
||||
struct parisc_device;
|
||||
struct ioc;
|
||||
|
||||
static inline struct pci_hba_data *parisc_walk_tree(struct device *dev)
|
||||
{
|
||||
struct device *otherdev;
|
||||
|
||||
if (likely(dev->platform_data))
|
||||
return dev->platform_data;
|
||||
|
||||
/* OK, just traverse the bus to find it */
|
||||
for (otherdev = dev->parent;
|
||||
otherdev;
|
||||
otherdev = otherdev->parent) {
|
||||
if (otherdev->platform_data) {
|
||||
dev->platform_data = otherdev->platform_data;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return dev->platform_data;
|
||||
}
|
||||
|
||||
static inline struct ioc *GET_IOC(struct device *dev)
|
||||
{
|
||||
struct pci_hba_data *pdata = parisc_walk_tree(dev);
|
||||
|
||||
if (!pdata)
|
||||
return NULL;
|
||||
return pdata->iommu;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IOMMU_CCIO
|
||||
void *ccio_get_iommu(const struct parisc_device *dev);
|
||||
int ccio_request_resource(const struct parisc_device *dev,
|
||||
struct resource *res);
|
||||
int ccio_allocate_resource(const struct parisc_device *dev,
|
||||
struct resource *res, unsigned long size,
|
||||
unsigned long min, unsigned long max, unsigned long align);
|
||||
#else /* !CONFIG_IOMMU_CCIO */
|
||||
#define ccio_get_iommu(dev) NULL
|
||||
#define ccio_request_resource(dev, res) insert_resource(&iomem_resource, res)
|
||||
#define ccio_allocate_resource(dev, res, size, min, max, align) \
|
||||
allocate_resource(&iomem_resource, res, size, min, max, \
|
||||
align, NULL, NULL)
|
||||
#endif /* !CONFIG_IOMMU_CCIO */
|
||||
|
||||
void *sba_get_iommu(struct parisc_device *dev);
|
||||
|
||||
#endif /* _IOMMU_H */
|
|
@ -126,21 +126,10 @@
|
|||
** o disable IRdT - call disable_irq(vector[line]->processor_irq)
|
||||
*/
|
||||
|
||||
|
||||
/* FIXME: determine which include files are really needed */
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/byteorder.h> /* get in-line asm for swab */
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/pdcpat.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/io.h> /* read/write functions */
|
||||
#ifdef CONFIG_SUPERIO
|
||||
#include <asm/superio.h>
|
||||
#endif
|
||||
|
@ -168,12 +157,8 @@
|
|||
#define DBG_IRT(x...)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#define COMPARE_IRTE_ADDR(irte, hpa) ((irte)->dest_iosapic_addr == (hpa))
|
||||
#else
|
||||
#define COMPARE_IRTE_ADDR(irte, hpa) \
|
||||
((irte)->dest_iosapic_addr == ((hpa) | 0xffffffff00000000ULL))
|
||||
#endif
|
||||
((irte)->dest_iosapic_addr == F_EXTEND(hpa))
|
||||
|
||||
#define IOSAPIC_REG_SELECT 0x00
|
||||
#define IOSAPIC_REG_WINDOW 0x10
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
#include <asm/parisc-device.h>
|
||||
#include <asm/io.h> /* read/write stuff */
|
||||
|
||||
#include "iommu.h"
|
||||
|
||||
#undef DEBUG_LBA /* general stuff */
|
||||
#undef DEBUG_LBA_PORT /* debug I/O Port access */
|
||||
#undef DEBUG_LBA_CFG /* debug Config Space Access (ie PCI Bus walk) */
|
||||
|
@ -109,12 +111,10 @@ static u32 lba_t32;
|
|||
|
||||
#define LBA_SKIP_PROBE(d) ((d)->flags & LBA_FLAG_SKIP_PROBE)
|
||||
|
||||
|
||||
/* Looks nice and keeps the compiler happy */
|
||||
#define LBA_DEV(d) ({ \
|
||||
void *__pdata = d; \
|
||||
BUG_ON(!__pdata); \
|
||||
(struct lba_device *)__pdata; })
|
||||
static inline struct lba_device *LBA_DEV(struct pci_hba_data *hba)
|
||||
{
|
||||
return container_of(hba, struct lba_device, hba);
|
||||
}
|
||||
|
||||
/*
|
||||
** Only allow 8 subsidiary busses per LBA
|
||||
|
@ -1275,7 +1275,7 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
|
|||
r->flags = IORESOURCE_MEM;
|
||||
/* mmio_mask also clears Enable bit */
|
||||
r->start &= mmio_mask;
|
||||
r->start = PCI_HOST_ADDR(HBA_DATA(lba_dev), r->start);
|
||||
r->start = PCI_HOST_ADDR(&lba_dev->hba, r->start);
|
||||
rsize = ~ READ_REG32(lba_dev->hba.base_addr + LBA_LMMIO_MASK);
|
||||
|
||||
/*
|
||||
|
@ -1321,7 +1321,7 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
|
|||
r->flags = IORESOURCE_MEM;
|
||||
/* mmio_mask also clears Enable bit */
|
||||
r->start &= mmio_mask;
|
||||
r->start = PCI_HOST_ADDR(HBA_DATA(lba_dev), r->start);
|
||||
r->start = PCI_HOST_ADDR(&lba_dev->hba, r->start);
|
||||
rsize = READ_REG32(lba_dev->hba.base_addr + LBA_ELMMIO_MASK);
|
||||
r->end = r->start + ~rsize;
|
||||
}
|
||||
|
@ -1562,7 +1562,7 @@ lba_driver_probe(struct parisc_device *dev)
|
|||
|
||||
/* ------------ Second : initialize common stuff ---------- */
|
||||
pci_bios = &lba_bios_ops;
|
||||
pcibios_register_hba(HBA_DATA(lba_dev));
|
||||
pcibios_register_hba(&lba_dev->hba);
|
||||
spin_lock_init(&lba_dev->lba_lock);
|
||||
|
||||
if (lba_hw_init(lba_dev))
|
||||
|
@ -1743,3 +1743,15 @@ static void quirk_diva_aux_disable(struct pci_dev *dev)
|
|||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX,
|
||||
quirk_diva_aux_disable);
|
||||
|
||||
static void quirk_tosca_aux_disable(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->subsystem_vendor != PCI_VENDOR_ID_HP ||
|
||||
dev->subsystem_device != 0x104a)
|
||||
return;
|
||||
|
||||
dev_info(&dev->dev, "Hiding Tosca secondary built-in AUX serial device");
|
||||
dev->device = 0;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA,
|
||||
quirk_tosca_aux_disable);
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
#include <asm/pdcpat.h> /* for is_pdc_pat() */
|
||||
#include <asm/parisc-device.h>
|
||||
|
||||
#include "iommu.h"
|
||||
|
||||
#define MODULE_NAME "SBA"
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче