diff options
Diffstat (limited to 'arch/ia64/kernel')
| -rw-r--r-- | arch/ia64/kernel/Makefile | 4 | ||||
| -rw-r--r-- | arch/ia64/kernel/dma-mapping.c | 13 | ||||
| -rw-r--r-- | arch/ia64/kernel/irq.c | 2 | ||||
| -rw-r--r-- | arch/ia64/kernel/irq_ia64.c | 31 | ||||
| -rw-r--r-- | arch/ia64/kernel/machvec.c | 8 | ||||
| -rw-r--r-- | arch/ia64/kernel/msi_ia64.c | 55 | ||||
| -rw-r--r-- | arch/ia64/kernel/palinfo.c | 2 | ||||
| -rw-r--r-- | arch/ia64/kernel/pci-dma.c | 46 | ||||
| -rw-r--r-- | arch/ia64/kernel/pci-swiotlb.c | 30 | ||||
| -rw-r--r-- | arch/ia64/kernel/perfmon.c | 2 | ||||
| -rw-r--r-- | arch/ia64/kernel/time.c | 16 |
11 files changed, 108 insertions, 101 deletions
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index c381ea954892..f2778f2c4fd9 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile | |||
| @@ -7,7 +7,7 @@ extra-y := head.o init_task.o vmlinux.lds | |||
| 7 | obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ | 7 | obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ |
| 8 | irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ | 8 | irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ |
| 9 | salinfo.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ | 9 | salinfo.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ |
| 10 | unwind.o mca.o mca_asm.o topology.o | 10 | unwind.o mca.o mca_asm.o topology.o dma-mapping.o |
| 11 | 11 | ||
| 12 | obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o | 12 | obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o |
| 13 | obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o | 13 | obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o |
| @@ -43,9 +43,7 @@ ifneq ($(CONFIG_IA64_ESI),) | |||
| 43 | obj-y += esi_stub.o # must be in kernel proper | 43 | obj-y += esi_stub.o # must be in kernel proper |
| 44 | endif | 44 | endif |
| 45 | obj-$(CONFIG_DMAR) += pci-dma.o | 45 | obj-$(CONFIG_DMAR) += pci-dma.o |
| 46 | ifeq ($(CONFIG_DMAR), y) | ||
| 47 | obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o | 46 | obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o |
| 48 | endif | ||
| 49 | 47 | ||
| 50 | # The gate DSO image is built using a special linker script. | 48 | # The gate DSO image is built using a special linker script. |
| 51 | targets += gate.so gate-syms.o | 49 | targets += gate.so gate-syms.o |
diff --git a/arch/ia64/kernel/dma-mapping.c b/arch/ia64/kernel/dma-mapping.c new file mode 100644 index 000000000000..086a2aeb0404 --- /dev/null +++ b/arch/ia64/kernel/dma-mapping.c | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #include <linux/dma-mapping.h> | ||
| 2 | |||
| 3 | /* Set this to 1 if there is a HW IOMMU in the system */ | ||
| 4 | int iommu_detected __read_mostly; | ||
| 5 | |||
| 6 | struct dma_map_ops *dma_ops; | ||
| 7 | EXPORT_SYMBOL(dma_ops); | ||
| 8 | |||
| 9 | struct dma_map_ops *dma_get_ops(struct device *dev) | ||
| 10 | { | ||
| 11 | return dma_ops; | ||
| 12 | } | ||
| 13 | EXPORT_SYMBOL(dma_get_ops); | ||
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 226233a6fa19..7429752ef5ad 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
| @@ -80,7 +80,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
| 80 | seq_printf(p, "%10u ", kstat_irqs(i)); | 80 | seq_printf(p, "%10u ", kstat_irqs(i)); |
| 81 | #else | 81 | #else |
| 82 | for_each_online_cpu(j) { | 82 | for_each_online_cpu(j) { |
| 83 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 83 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
| 84 | } | 84 | } |
| 85 | #endif | 85 | #endif |
| 86 | seq_printf(p, " %14s", irq_desc[i].chip->name); | 86 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 927ad027820c..acc4d19ae62a 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
| @@ -493,16 +493,15 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
| 493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); | 493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); |
| 494 | ia64_srlz_d(); | 494 | ia64_srlz_d(); |
| 495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
| 496 | struct irq_desc *desc = irq_to_desc(vector); | 496 | int irq = local_vector_to_irq(vector); |
| 497 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 497 | 498 | ||
| 498 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 499 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
| 499 | smp_local_flush_tlb(); | 500 | smp_local_flush_tlb(); |
| 500 | kstat_incr_irqs_this_cpu(vector, desc); | 501 | kstat_incr_irqs_this_cpu(irq, desc); |
| 501 | } else if (unlikely(IS_RESCHEDULE(vector))) | 502 | } else if (unlikely(IS_RESCHEDULE(vector))) { |
| 502 | kstat_incr_irqs_this_cpu(vector, desc); | 503 | kstat_incr_irqs_this_cpu(irq, desc); |
| 503 | else { | 504 | } else { |
| 504 | int irq = local_vector_to_irq(vector); | ||
| 505 | |||
| 506 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 505 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
| 507 | ia64_srlz_d(); | 506 | ia64_srlz_d(); |
| 508 | 507 | ||
| @@ -545,24 +544,24 @@ void ia64_process_pending_intr(void) | |||
| 545 | 544 | ||
| 546 | vector = ia64_get_ivr(); | 545 | vector = ia64_get_ivr(); |
| 547 | 546 | ||
| 548 | irq_enter(); | 547 | irq_enter(); |
| 549 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); | 548 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); |
| 550 | ia64_srlz_d(); | 549 | ia64_srlz_d(); |
| 551 | 550 | ||
| 552 | /* | 551 | /* |
| 553 | * Perform normal interrupt style processing | 552 | * Perform normal interrupt style processing |
| 554 | */ | 553 | */ |
| 555 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 554 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
| 556 | struct irq_desc *desc = irq_to_desc(vector); | 555 | int irq = local_vector_to_irq(vector); |
| 556 | struct irq_desc *desc = irq_to_desc(irq); | ||
| 557 | 557 | ||
| 558 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 558 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
| 559 | smp_local_flush_tlb(); | 559 | smp_local_flush_tlb(); |
| 560 | kstat_incr_irqs_this_cpu(vector, desc); | 560 | kstat_incr_irqs_this_cpu(irq, desc); |
| 561 | } else if (unlikely(IS_RESCHEDULE(vector))) | 561 | } else if (unlikely(IS_RESCHEDULE(vector))) { |
| 562 | kstat_incr_irqs_this_cpu(vector, desc); | 562 | kstat_incr_irqs_this_cpu(irq, desc); |
| 563 | else { | 563 | } else { |
| 564 | struct pt_regs *old_regs = set_irq_regs(NULL); | 564 | struct pt_regs *old_regs = set_irq_regs(NULL); |
| 565 | int irq = local_vector_to_irq(vector); | ||
| 566 | 565 | ||
| 567 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 566 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
| 568 | ia64_srlz_d(); | 567 | ia64_srlz_d(); |
diff --git a/arch/ia64/kernel/machvec.c b/arch/ia64/kernel/machvec.c index 7ccb228ceedc..d41a40ef80c0 100644 --- a/arch/ia64/kernel/machvec.c +++ b/arch/ia64/kernel/machvec.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #include <linux/module.h> | 1 | #include <linux/module.h> |
| 2 | 2 | #include <linux/dma-mapping.h> | |
| 3 | #include <asm/machvec.h> | 3 | #include <asm/machvec.h> |
| 4 | #include <asm/system.h> | 4 | #include <asm/system.h> |
| 5 | 5 | ||
| @@ -75,14 +75,16 @@ machvec_timer_interrupt (int irq, void *dev_id) | |||
| 75 | EXPORT_SYMBOL(machvec_timer_interrupt); | 75 | EXPORT_SYMBOL(machvec_timer_interrupt); |
| 76 | 76 | ||
| 77 | void | 77 | void |
| 78 | machvec_dma_sync_single (struct device *hwdev, dma_addr_t dma_handle, size_t size, int dir) | 78 | machvec_dma_sync_single(struct device *hwdev, dma_addr_t dma_handle, size_t size, |
| 79 | enum dma_data_direction dir) | ||
| 79 | { | 80 | { |
| 80 | mb(); | 81 | mb(); |
| 81 | } | 82 | } |
| 82 | EXPORT_SYMBOL(machvec_dma_sync_single); | 83 | EXPORT_SYMBOL(machvec_dma_sync_single); |
| 83 | 84 | ||
| 84 | void | 85 | void |
| 85 | machvec_dma_sync_sg (struct device *hwdev, struct scatterlist *sg, int n, int dir) | 86 | machvec_dma_sync_sg(struct device *hwdev, struct scatterlist *sg, int n, |
| 87 | enum dma_data_direction dir) | ||
| 86 | { | 88 | { |
| 87 | mb(); | 89 | mb(); |
| 88 | } | 90 | } |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index dcb6b7c51ea7..2b15e233f7fe 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
| @@ -7,44 +7,7 @@ | |||
| 7 | #include <linux/msi.h> | 7 | #include <linux/msi.h> |
| 8 | #include <linux/dmar.h> | 8 | #include <linux/dmar.h> |
| 9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
| 10 | 10 | #include <asm/msidef.h> | |
| 11 | /* | ||
| 12 | * Shifts for APIC-based data | ||
| 13 | */ | ||
| 14 | |||
| 15 | #define MSI_DATA_VECTOR_SHIFT 0 | ||
| 16 | #define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) | ||
| 17 | #define MSI_DATA_VECTOR_MASK 0xffffff00 | ||
| 18 | |||
| 19 | #define MSI_DATA_DELIVERY_SHIFT 8 | ||
| 20 | #define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT) | ||
| 21 | #define MSI_DATA_DELIVERY_LOWPRI (1 << MSI_DATA_DELIVERY_SHIFT) | ||
| 22 | |||
| 23 | #define MSI_DATA_LEVEL_SHIFT 14 | ||
| 24 | #define MSI_DATA_LEVEL_DEASSERT (0 << MSI_DATA_LEVEL_SHIFT) | ||
| 25 | #define MSI_DATA_LEVEL_ASSERT (1 << MSI_DATA_LEVEL_SHIFT) | ||
| 26 | |||
| 27 | #define MSI_DATA_TRIGGER_SHIFT 15 | ||
| 28 | #define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT) | ||
| 29 | #define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT) | ||
| 30 | |||
| 31 | /* | ||
| 32 | * Shift/mask fields for APIC-based bus address | ||
| 33 | */ | ||
| 34 | |||
| 35 | #define MSI_TARGET_CPU_SHIFT 4 | ||
| 36 | #define MSI_ADDR_HEADER 0xfee00000 | ||
| 37 | |||
| 38 | #define MSI_ADDR_DESTID_MASK 0xfff0000f | ||
| 39 | #define MSI_ADDR_DESTID_CPU(cpu) ((cpu) << MSI_TARGET_CPU_SHIFT) | ||
| 40 | |||
| 41 | #define MSI_ADDR_DESTMODE_SHIFT 2 | ||
| 42 | #define MSI_ADDR_DESTMODE_PHYS (0 << MSI_ADDR_DESTMODE_SHIFT) | ||
| 43 | #define MSI_ADDR_DESTMODE_LOGIC (1 << MSI_ADDR_DESTMODE_SHIFT) | ||
| 44 | |||
| 45 | #define MSI_ADDR_REDIRECTION_SHIFT 3 | ||
| 46 | #define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT) | ||
| 47 | #define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) | ||
| 48 | 11 | ||
| 49 | static struct irq_chip ia64_msi_chip; | 12 | static struct irq_chip ia64_msi_chip; |
| 50 | 13 | ||
| @@ -65,8 +28,8 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
| 65 | read_msi_msg(irq, &msg); | 28 | read_msi_msg(irq, &msg); |
| 66 | 29 | ||
| 67 | addr = msg.address_lo; | 30 | addr = msg.address_lo; |
| 68 | addr &= MSI_ADDR_DESTID_MASK; | 31 | addr &= MSI_ADDR_DEST_ID_MASK; |
| 69 | addr |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 32 | addr |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu)); |
| 70 | msg.address_lo = addr; | 33 | msg.address_lo = addr; |
| 71 | 34 | ||
| 72 | data = msg.data; | 35 | data = msg.data; |
| @@ -98,9 +61,9 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc) | |||
| 98 | msg.address_hi = 0; | 61 | msg.address_hi = 0; |
| 99 | msg.address_lo = | 62 | msg.address_lo = |
| 100 | MSI_ADDR_HEADER | | 63 | MSI_ADDR_HEADER | |
| 101 | MSI_ADDR_DESTMODE_PHYS | | 64 | MSI_ADDR_DEST_MODE_PHYS | |
| 102 | MSI_ADDR_REDIRECTION_CPU | | 65 | MSI_ADDR_REDIRECTION_CPU | |
| 103 | MSI_ADDR_DESTID_CPU(dest_phys_id); | 66 | MSI_ADDR_DEST_ID_CPU(dest_phys_id); |
| 104 | 67 | ||
| 105 | msg.data = | 68 | msg.data = |
| 106 | MSI_DATA_TRIGGER_EDGE | | 69 | MSI_DATA_TRIGGER_EDGE | |
| @@ -183,8 +146,8 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
| 183 | 146 | ||
| 184 | msg.data &= ~MSI_DATA_VECTOR_MASK; | 147 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
| 185 | msg.data |= MSI_DATA_VECTOR(cfg->vector); | 148 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
| 186 | msg.address_lo &= ~MSI_ADDR_DESTID_MASK; | 149 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; |
| 187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 150 | msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu)); |
| 188 | 151 | ||
| 189 | dmar_msi_write(irq, &msg); | 152 | dmar_msi_write(irq, &msg); |
| 190 | cpumask_copy(irq_desc[irq].affinity, mask); | 153 | cpumask_copy(irq_desc[irq].affinity, mask); |
| @@ -215,9 +178,9 @@ msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg) | |||
| 215 | msg->address_hi = 0; | 178 | msg->address_hi = 0; |
| 216 | msg->address_lo = | 179 | msg->address_lo = |
| 217 | MSI_ADDR_HEADER | | 180 | MSI_ADDR_HEADER | |
| 218 | MSI_ADDR_DESTMODE_PHYS | | 181 | MSI_ADDR_DEST_MODE_PHYS | |
| 219 | MSI_ADDR_REDIRECTION_CPU | | 182 | MSI_ADDR_REDIRECTION_CPU | |
| 220 | MSI_ADDR_DESTID_CPU(dest); | 183 | MSI_ADDR_DEST_ID_CPU(dest); |
| 221 | 184 | ||
| 222 | msg->data = | 185 | msg->data = |
| 223 | MSI_DATA_TRIGGER_EDGE | | 186 | MSI_DATA_TRIGGER_EDGE | |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index e5c57f413ca2..a4f19c70aadd 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
| @@ -1002,8 +1002,6 @@ create_palinfo_proc_entries(unsigned int cpu) | |||
| 1002 | *pdir = create_proc_read_entry( | 1002 | *pdir = create_proc_read_entry( |
| 1003 | palinfo_entries[j].name, 0, cpu_dir, | 1003 | palinfo_entries[j].name, 0, cpu_dir, |
| 1004 | palinfo_read_entry, (void *)f.value); | 1004 | palinfo_read_entry, (void *)f.value); |
| 1005 | if (*pdir) | ||
| 1006 | (*pdir)->owner = THIS_MODULE; | ||
| 1007 | pdir++; | 1005 | pdir++; |
| 1008 | } | 1006 | } |
| 1009 | } | 1007 | } |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index d0ada067a4af..e4cb443bb988 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
| @@ -32,9 +32,6 @@ int force_iommu __read_mostly = 1; | |||
| 32 | int force_iommu __read_mostly; | 32 | int force_iommu __read_mostly; |
| 33 | #endif | 33 | #endif |
| 34 | 34 | ||
| 35 | /* Set this to 1 if there is a HW IOMMU in the system */ | ||
| 36 | int iommu_detected __read_mostly; | ||
| 37 | |||
| 38 | /* Dummy device used for NULL arguments (normally ISA). Better would | 35 | /* Dummy device used for NULL arguments (normally ISA). Better would |
| 39 | be probably a smaller DMA mask, but this is bug-to-bug compatible | 36 | be probably a smaller DMA mask, but this is bug-to-bug compatible |
| 40 | to i386. */ | 37 | to i386. */ |
| @@ -44,18 +41,7 @@ struct device fallback_dev = { | |||
| 44 | .dma_mask = &fallback_dev.coherent_dma_mask, | 41 | .dma_mask = &fallback_dev.coherent_dma_mask, |
| 45 | }; | 42 | }; |
| 46 | 43 | ||
| 47 | void __init pci_iommu_alloc(void) | 44 | extern struct dma_map_ops intel_dma_ops; |
| 48 | { | ||
| 49 | /* | ||
| 50 | * The order of these functions is important for | ||
| 51 | * fall-back/fail-over reasons | ||
| 52 | */ | ||
| 53 | detect_intel_iommu(); | ||
| 54 | |||
| 55 | #ifdef CONFIG_SWIOTLB | ||
| 56 | pci_swiotlb_init(); | ||
| 57 | #endif | ||
| 58 | } | ||
| 59 | 45 | ||
| 60 | static int __init pci_iommu_init(void) | 46 | static int __init pci_iommu_init(void) |
| 61 | { | 47 | { |
| @@ -79,15 +65,12 @@ iommu_dma_init(void) | |||
| 79 | return; | 65 | return; |
| 80 | } | 66 | } |
| 81 | 67 | ||
| 82 | struct dma_mapping_ops *dma_ops; | ||
| 83 | EXPORT_SYMBOL(dma_ops); | ||
| 84 | |||
| 85 | int iommu_dma_supported(struct device *dev, u64 mask) | 68 | int iommu_dma_supported(struct device *dev, u64 mask) |
| 86 | { | 69 | { |
| 87 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 70 | struct dma_map_ops *ops = platform_dma_get_ops(dev); |
| 88 | 71 | ||
| 89 | if (ops->dma_supported_op) | 72 | if (ops->dma_supported) |
| 90 | return ops->dma_supported_op(dev, mask); | 73 | return ops->dma_supported(dev, mask); |
| 91 | 74 | ||
| 92 | /* Copied from i386. Doesn't make much sense, because it will | 75 | /* Copied from i386. Doesn't make much sense, because it will |
| 93 | only work for pci_alloc_coherent. | 76 | only work for pci_alloc_coherent. |
| @@ -116,4 +99,25 @@ int iommu_dma_supported(struct device *dev, u64 mask) | |||
| 116 | } | 99 | } |
| 117 | EXPORT_SYMBOL(iommu_dma_supported); | 100 | EXPORT_SYMBOL(iommu_dma_supported); |
| 118 | 101 | ||
| 102 | void __init pci_iommu_alloc(void) | ||
| 103 | { | ||
| 104 | dma_ops = &intel_dma_ops; | ||
| 105 | |||
| 106 | dma_ops->sync_single_for_cpu = machvec_dma_sync_single; | ||
| 107 | dma_ops->sync_sg_for_cpu = machvec_dma_sync_sg; | ||
| 108 | dma_ops->sync_single_for_device = machvec_dma_sync_single; | ||
| 109 | dma_ops->sync_sg_for_device = machvec_dma_sync_sg; | ||
| 110 | dma_ops->dma_supported = iommu_dma_supported; | ||
| 111 | |||
| 112 | /* | ||
| 113 | * The order of these functions is important for | ||
| 114 | * fall-back/fail-over reasons | ||
| 115 | */ | ||
| 116 | detect_intel_iommu(); | ||
| 117 | |||
| 118 | #ifdef CONFIG_SWIOTLB | ||
| 119 | pci_swiotlb_init(); | ||
| 120 | #endif | ||
| 121 | } | ||
| 122 | |||
| 119 | #endif | 123 | #endif |
diff --git a/arch/ia64/kernel/pci-swiotlb.c b/arch/ia64/kernel/pci-swiotlb.c index 16c50516dbc1..573f02c39a00 100644 --- a/arch/ia64/kernel/pci-swiotlb.c +++ b/arch/ia64/kernel/pci-swiotlb.c | |||
| @@ -13,23 +13,37 @@ | |||
| 13 | int swiotlb __read_mostly; | 13 | int swiotlb __read_mostly; |
| 14 | EXPORT_SYMBOL(swiotlb); | 14 | EXPORT_SYMBOL(swiotlb); |
| 15 | 15 | ||
| 16 | struct dma_mapping_ops swiotlb_dma_ops = { | 16 | static void *ia64_swiotlb_alloc_coherent(struct device *dev, size_t size, |
| 17 | .mapping_error = swiotlb_dma_mapping_error, | 17 | dma_addr_t *dma_handle, gfp_t gfp) |
| 18 | .alloc_coherent = swiotlb_alloc_coherent, | 18 | { |
| 19 | if (dev->coherent_dma_mask != DMA_64BIT_MASK) | ||
| 20 | gfp |= GFP_DMA; | ||
| 21 | return swiotlb_alloc_coherent(dev, size, dma_handle, gfp); | ||
| 22 | } | ||
| 23 | |||
| 24 | struct dma_map_ops swiotlb_dma_ops = { | ||
| 25 | .alloc_coherent = ia64_swiotlb_alloc_coherent, | ||
| 19 | .free_coherent = swiotlb_free_coherent, | 26 | .free_coherent = swiotlb_free_coherent, |
| 20 | .map_single = swiotlb_map_single, | 27 | .map_page = swiotlb_map_page, |
| 21 | .unmap_single = swiotlb_unmap_single, | 28 | .unmap_page = swiotlb_unmap_page, |
| 29 | .map_sg = swiotlb_map_sg_attrs, | ||
| 30 | .unmap_sg = swiotlb_unmap_sg_attrs, | ||
| 22 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, | 31 | .sync_single_for_cpu = swiotlb_sync_single_for_cpu, |
| 23 | .sync_single_for_device = swiotlb_sync_single_for_device, | 32 | .sync_single_for_device = swiotlb_sync_single_for_device, |
| 24 | .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu, | 33 | .sync_single_range_for_cpu = swiotlb_sync_single_range_for_cpu, |
| 25 | .sync_single_range_for_device = swiotlb_sync_single_range_for_device, | 34 | .sync_single_range_for_device = swiotlb_sync_single_range_for_device, |
| 26 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, | 35 | .sync_sg_for_cpu = swiotlb_sync_sg_for_cpu, |
| 27 | .sync_sg_for_device = swiotlb_sync_sg_for_device, | 36 | .sync_sg_for_device = swiotlb_sync_sg_for_device, |
| 28 | .map_sg = swiotlb_map_sg, | 37 | .dma_supported = swiotlb_dma_supported, |
| 29 | .unmap_sg = swiotlb_unmap_sg, | 38 | .mapping_error = swiotlb_dma_mapping_error, |
| 30 | .dma_supported_op = swiotlb_dma_supported, | ||
| 31 | }; | 39 | }; |
| 32 | 40 | ||
| 41 | void __init swiotlb_dma_init(void) | ||
| 42 | { | ||
| 43 | dma_ops = &swiotlb_dma_ops; | ||
| 44 | swiotlb_init(); | ||
| 45 | } | ||
| 46 | |||
| 33 | void __init pci_swiotlb_init(void) | 47 | void __init pci_swiotlb_init(void) |
| 34 | { | 48 | { |
| 35 | if (!iommu_detected) { | 49 | if (!iommu_detected) { |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 0e499757309b..5c0f408cfd71 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
| @@ -2196,7 +2196,7 @@ pfmfs_delete_dentry(struct dentry *dentry) | |||
| 2196 | return 1; | 2196 | return 1; |
| 2197 | } | 2197 | } |
| 2198 | 2198 | ||
| 2199 | static struct dentry_operations pfmfs_dentry_operations = { | 2199 | static const struct dentry_operations pfmfs_dentry_operations = { |
| 2200 | .d_delete = pfmfs_delete_dentry, | 2200 | .d_delete = pfmfs_delete_dentry, |
| 2201 | }; | 2201 | }; |
| 2202 | 2202 | ||
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index f0ebb342409d..d6747bae52d8 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/efi.h> | 20 | #include <linux/efi.h> |
| 21 | #include <linux/timex.h> | 21 | #include <linux/timex.h> |
| 22 | #include <linux/clocksource.h> | 22 | #include <linux/clocksource.h> |
| 23 | #include <linux/platform_device.h> | ||
| 23 | 24 | ||
| 24 | #include <asm/machvec.h> | 25 | #include <asm/machvec.h> |
| 25 | #include <asm/delay.h> | 26 | #include <asm/delay.h> |
| @@ -405,6 +406,21 @@ static struct irqaction timer_irqaction = { | |||
| 405 | .name = "timer" | 406 | .name = "timer" |
| 406 | }; | 407 | }; |
| 407 | 408 | ||
| 409 | static struct platform_device rtc_efi_dev = { | ||
| 410 | .name = "rtc-efi", | ||
| 411 | .id = -1, | ||
| 412 | }; | ||
| 413 | |||
| 414 | static int __init rtc_init(void) | ||
| 415 | { | ||
| 416 | if (platform_device_register(&rtc_efi_dev) < 0) | ||
| 417 | printk(KERN_ERR "unable to register rtc device...\n"); | ||
| 418 | |||
| 419 | /* not necessarily an error */ | ||
| 420 | return 0; | ||
| 421 | } | ||
| 422 | module_init(rtc_init); | ||
| 423 | |||
| 408 | void __init | 424 | void __init |
| 409 | time_init (void) | 425 | time_init (void) |
| 410 | { | 426 | { |
