[kernel] r6666 - dists/sid/linux-2.6/debian/patches
Christian T. Steigies
cts at costa.debian.org
Sun May 21 21:00:03 UTC 2006
Author: cts
Date: Sun May 21 21:00:01 2006
New Revision: 6666
Added:
dists/sid/linux-2.6/debian/patches/m68k-dma.patch
dists/sid/linux-2.6/debian/patches/m68k-wildfire.patch
Log:
add (experimental) m68k DMA and wildfire patches
Added: dists/sid/linux-2.6/debian/patches/m68k-dma.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/m68k-dma.patch Sun May 21 21:00:01 2006
@@ -0,0 +1,282 @@
+ arch/m68k/kernel/Makefile | 4 -
+ arch/m68k/kernel/dma.c | 112 +++++++++++++++++++++++++++++++++++++++++
+ include/asm-m68k/dma-mapping.h | 63 ++++++++++++++++++++---
+ include/asm-m68k/scatterlist.h | 9 +--
+ 4 files changed, 175 insertions(+), 13 deletions(-)
+
+Index: linux-tmp/include/asm-m68k/scatterlist.h
+===================================================================
+--- linux-tmp.orig/include/asm-m68k/scatterlist.h 2005-06-04 21:57:39.000000000 +0200
++++ linux-tmp/include/asm-m68k/scatterlist.h 2005-06-04 21:57:50.000000000 +0200
+@@ -2,18 +2,17 @@
+ #define _M68K_SCATTERLIST_H
+
+ struct scatterlist {
+- /* These two are only valid if ADDRESS member of this
+- * struct is NULL.
+- */
+ struct page *page;
+ unsigned int offset;
+-
+ unsigned int length;
+
+- __u32 dvma_address; /* A place to hang host-specific addresses at. */
++ __u32 dma_address; /* A place to hang host-specific addresses at. */
+ };
+
+ /* This is bogus and should go away. */
+ #define ISA_DMA_THRESHOLD (0x00ffffff)
+
++#define sg_dma_address(sg) ((sg)->dma_address)
++#define sg_dma_len(sg) ((sg)->length)
++
+ #endif /* !(_M68K_SCATTERLIST_H) */
+Index: linux-tmp/arch/m68k/kernel/Makefile
+===================================================================
+--- linux-tmp.orig/arch/m68k/kernel/Makefile 2005-06-04 21:57:39.000000000 +0200
++++ linux-tmp/arch/m68k/kernel/Makefile 2005-06-04 21:57:50.000000000 +0200
+@@ -9,8 +9,8 @@ else
+ endif
+ extra-y += vmlinux.lds
+
+-obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o \
+- sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
++obj-y := entry.o process.o traps.o ints.o dma.o signal.o ptrace.o \
++ sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
+
+ obj-$(CONFIG_PCI) += bios32.o
+ obj-$(CONFIG_MODULES) += module.o
+Index: linux-tmp/arch/m68k/kernel/dma.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-tmp/arch/m68k/kernel/dma.c 2005-06-04 22:30:41.495377370 +0200
+@@ -0,0 +1,112 @@
++
++#include <linux/dma-mapping.h>
++#include <linux/device.h>
++#include <linux/kernel.h>
++#include <linux/vmalloc.h>
++
++#include <asm/pgalloc.h>
++#include <asm/scatterlist.h>
++
++void *dma_alloc_coherent(struct device *dev, size_t size,
++ dma_addr_t *handle, int flag)
++{
++ struct page *page, **map;
++ pgprot_t pgprot;
++ void *addr;
++ int i, order;
++
++ pr_debug("dma_alloc_coherent: %d,%x\n", size, flag);
++
++ size = PAGE_ALIGN(size);
++ order = get_order(size);
++
++ page = alloc_pages(flag, order);
++ if (!page)
++ return NULL;
++
++ *handle = page_to_phys(page);
++ map = kmalloc(sizeof(struct page *) << order, flag);
++ if (!map) {
++ __free_pages(page, order);
++ return NULL;
++ }
++ order = 1 << order;
++ size >>= PAGE_SHIFT;
++ map[0] = page;
++ for (i = 1; i < size; i++) {
++ map[i] = page + i;
++ get_page(map[i]);
++ }
++ for (; i < order; i++)
++ __free_page(page + i);
++ pgprot = __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
++ if (CPU_IS_040_OR_060)
++ pgprot_val(pgprot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S;
++ else
++ pgprot_val(pgprot) |= _PAGE_NOCACHE030;
++ addr = vmap(map, size, flag, pgprot);
++ kfree(map);
++
++ return addr;
++}
++
++void dma_free_coherent(struct device *dev, size_t size,
++ void *addr, dma_addr_t handle)
++{
++ vfree(addr);
++}
++
++inline void dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size,
++ enum dma_data_direction dir)
++{
++ if (dir == DMA_TO_DEVICE)
++ cache_push(handle, size);
++ else if (dir == DMA_FROM_DEVICE)
++ cache_clear(handle, size);
++}
++
++void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
++ enum dma_data_direction dir)
++{
++ int i;
++
++ for (i = 0; i < nents; sg++, i++)
++ dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
++}
++
++dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size,
++ enum dma_data_direction dir)
++{
++ dma_addr_t handle = virt_to_bus(addr);
++ dma_sync_single_for_device(dev, handle, size, dir);
++ return handle;
++}
++
++dma_addr_t dma_map_page(struct device *dev, struct page *page,
++ unsigned long offset, size_t size,
++ enum dma_data_direction dir)
++{
++ dma_addr_t handle = page_to_phys(page) + offset;
++ dma_sync_single_for_device(dev, handle, size, dir);
++ return handle;
++}
++
++int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
++ enum dma_data_direction dir)
++{
++ int i;
++
++ for (i = 0; i < nents; sg++, i++) {
++ sg->dma_address = page_to_phys(sg->page) + sg->offset;
++ dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
++ }
++ return nents;
++}
++
++EXPORT_SYMBOL(dma_alloc_coherent);
++EXPORT_SYMBOL(dma_free_coherent);
++EXPORT_SYMBOL(dma_map_single);
++EXPORT_SYMBOL(dma_map_page);
++EXPORT_SYMBOL(dma_map_sg);
++EXPORT_SYMBOL(dma_sync_single_for_device);
++EXPORT_SYMBOL(dma_sync_sg_for_device);
+Index: linux-tmp/include/asm-m68k/dma-mapping.h
+===================================================================
+--- linux-tmp.orig/include/asm-m68k/dma-mapping.h 2005-06-04 21:57:39.000000000 +0200
++++ linux-tmp/include/asm-m68k/dma-mapping.h 2005-06-04 21:57:50.000000000 +0200
+@@ -1,12 +1,63 @@
+ #ifndef _M68K_DMA_MAPPING_H
+ #define _M68K_DMA_MAPPING_H
+
+-#include <linux/config.h>
++struct scatterlist;
+
+-#ifdef CONFIG_PCI
+-#include <asm-generic/dma-mapping.h>
+-#else
+-#include <asm-generic/dma-mapping-broken.h>
+-#endif
++static inline int dma_supported(struct device *dev, u64 mask)
++{
++ return 1;
++}
++
++static inline int dma_set_mask(struct device *dev, u64 mask)
++{
++ return 0;
++}
++
++extern void *dma_alloc_coherent(struct device *, size_t,
++ dma_addr_t *, int);
++extern void dma_free_coherent(struct device *, size_t,
++ void *, dma_addr_t);
++
++extern dma_addr_t dma_map_single(struct device *, void *, size_t,
++ enum dma_data_direction);
++static inline void dma_unmap_single(struct device *dev, dma_addr_t addr,
++ size_t size, enum dma_data_direction dir)
++{
++}
++
++extern dma_addr_t dma_map_page(struct device *, struct page *,
++ unsigned long, size_t size,
++ enum dma_data_direction);
++static inline void dma_unmap_page(struct device *dev, dma_addr_t address,
++ size_t size, enum dma_data_direction dir)
++{
++}
++
++extern int dma_map_sg(struct device *, struct scatterlist *, int,
++ enum dma_data_direction);
++static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
++ int nhwentries, enum dma_data_direction dir)
++{
++}
++
++extern void dma_sync_single_for_device(struct device *, dma_addr_t, size_t,
++ enum dma_data_direction);
++extern void dma_sync_sg_for_device(struct device *, struct scatterlist *, int,
++ enum dma_data_direction);
++
++static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle,
++ size_t size, enum dma_data_direction dir)
++{
++}
++
++static inline void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
++ int nents, enum dma_data_direction dir)
++{
++}
++
++static inline int dma_mapping_error(dma_addr_t handle)
++{
++ return 0;
++}
+
+ #endif /* _M68K_DMA_MAPPING_H */
+diff -pur -X /home/roman/nodiff linux-tmp/arch/m68k/apollo/Makefile linux/arch/m68k/apollo/Makefile
+--- linux-tmp/arch/m68k/apollo/Makefile 2002-12-17 00:58:44.000000000 +0100
++++ linux/arch/m68k/apollo/Makefile 2005-06-10 23:28:12.000000000 +0200
+@@ -2,4 +2,4 @@
+ # Makefile for Linux arch/m68k/amiga source directory
+ #
+
+-obj-y := config.o dn_ints.o dma.o
++obj-y := config.o dn_ints.o
+diff -pur -X /home/roman/nodiff linux-tmp/drivers/scsi/sun3x_esp.c linux/drivers/scsi/sun3x_esp.c
+--- linux-tmp/drivers/scsi/sun3x_esp.c 2004-12-30 00:48:46.000000000 +0100
++++ linux/drivers/scsi/sun3x_esp.c 2005-06-11 02:43:27.000000000 +0200
+@@ -334,11 +334,11 @@ static void dma_mmu_get_scsi_sgl (struct
+ struct scatterlist *sg = sp->SCp.buffer;
+
+ while (sz >= 0) {
+- sg[sz].dvma_address = dvma_map((unsigned long)page_address(sg[sz].page) +
++ sg[sz].dma_address = dvma_map((unsigned long)page_address(sg[sz].page) +
+ sg[sz].offset, sg[sz].length);
+ sz--;
+ }
+- sp->SCp.ptr=(char *)((unsigned long)sp->SCp.buffer->dvma_address);
++ sp->SCp.ptr=(char *)((unsigned long)sp->SCp.buffer->dma_address);
+ }
+
+ static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, Scsi_Cmnd *sp)
+@@ -352,14 +352,14 @@ static void dma_mmu_release_scsi_sgl (st
+ struct scatterlist *sg = (struct scatterlist *)sp->buffer;
+
+ while(sz >= 0) {
+- dvma_unmap((char *)sg[sz].dvma_address);
++ dvma_unmap((char *)sg[sz].dma_address);
+ sz--;
+ }
+ }
+
+ static void dma_advance_sg (Scsi_Cmnd *sp)
+ {
+- sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dvma_address);
++ sp->SCp.ptr = (char *)((unsigned long)sp->SCp.buffer->dma_address);
+ }
+
+ static int sun3x_esp_release(struct Scsi_Host *instance)
Added: dists/sid/linux-2.6/debian/patches/m68k-wildfire.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/m68k-wildfire.patch Sun May 21 21:00:01 2006
@@ -0,0 +1,288 @@
+ arch/m68k/Kconfig | 8 +++
+ arch/m68k/amiga/Makefile | 1
+ arch/m68k/amiga/wildfire.c | 93 +++++++++++++++++++++++++++++++++++++++++++
+ arch/m68k/kernel/Makefile | 1
+ include/asm-m68k/amigaints.h | 14 ++++++
+ include/asm-m68k/io.h | 20 +++++----
+ include/asm-m68k/pci.h | 38 +++++------------
+ 7 files changed, 137 insertions(+), 38 deletions(-)
+
+Index: linux-tmp/arch/m68k/Kconfig
+===================================================================
+--- linux-tmp.orig/arch/m68k/Kconfig 2005-06-14 02:49:00.474288599 +0200
++++ linux-tmp/arch/m68k/Kconfig 2005-06-14 02:49:06.131323437 +0200
+@@ -92,6 +92,12 @@ config AMIGA
+ you plan to use this kernel on an Amiga, say Y here and browse the
+ material available in <file:Documentation/m68k>; otherwise say N.
+
++config WILDFIRE
++ bool "WildFire support"
++ depends on AMIGA
++ help
++ This option enables support for the WildFire accelerator card.
++
+ config ATARI
+ bool "Atari support"
+ depends on !MMU_SUN3
+@@ -110,7 +116,7 @@ config HADES
+
+ config PCI
+ bool
+- depends on HADES
++ depends on HADES || WILDFIRE
+ default y
+ help
+ Find out whether you have a PCI motherboard. PCI is the name of a
+Index: linux-tmp/arch/m68k/amiga/Makefile
+===================================================================
+--- linux-tmp.orig/arch/m68k/amiga/Makefile 2005-06-14 02:49:00.474288599 +0200
++++ linux-tmp/arch/m68k/amiga/Makefile 2005-06-14 02:49:06.131323437 +0200
+@@ -5,3 +5,4 @@
+ obj-y := config.o amiints.o cia.o chipram.o amisound.o amiga_ksyms.o
+
+ obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o
++obj-$(CONFIG_WILDFIRE) += wildfire.o
+Index: linux-tmp/include/asm-m68k/amigaints.h
+===================================================================
+--- linux-tmp.orig/include/asm-m68k/amigaints.h 2005-06-14 02:49:00.474288599 +0200
++++ linux-tmp/include/asm-m68k/amigaints.h 2005-06-14 02:49:06.131323437 +0200
+@@ -23,7 +23,8 @@
+ #define AUTO_IRQS (8)
+ #define AMI_STD_IRQS (14)
+ #define CIA_IRQS (5)
+-#define AMI_IRQS (32) /* AUTO_IRQS+AMI_STD_IRQS+2*CIA_IRQS */
++#define WILDFIRE_IRQS (9)
++#define AMI_IRQS (41) /* AUTO_IRQS+AMI_STD_IRQS+2*CIA_IRQS+WILDFIRE_IRQS */
+
+ /* builtin serial port interrupts */
+ #define IRQ_AMIGA_TBE (IRQ_USER+0)
+@@ -108,4 +109,15 @@ extern void cia_init_IRQ(struct ciabase
+ extern unsigned char cia_set_irq(struct ciabase *base, unsigned char mask);
+ extern unsigned char cia_able_irq(struct ciabase *base, unsigned char mask);
+
++#define IRQ_WF 32
++#define IRQ_WF_WRERR 32
++#define IRQ_WF_PCI_INT0 33
++#define IRQ_WF_PCI_INT1 34
++#define IRQ_WF_PCI_INT2 35
++#define IRQ_WF_PCI_INT3 36
++#define IRQ_WF_PCI_INT4 37
++#define IRQ_WF_PERR 38
++#define IRQ_WF_SERR 39
++#define IRQ_WF_MERR 40
++
+ #endif /* asm-m68k/amigaints.h */
+Index: linux-tmp/include/asm-m68k/io.h
+===================================================================
+--- linux-tmp.orig/include/asm-m68k/io.h 2005-06-14 02:49:00.475288428 +0200
++++ linux-tmp/include/asm-m68k/io.h 2005-06-14 02:49:06.132323267 +0200
+@@ -262,16 +262,16 @@ static inline void isa_delay(void)
+
+ #if defined(CONFIG_PCI)
+
+-#define inl(port) in_le32(port)
+-#define outl(val,port) out_le32((port),(val))
+-#define readl(addr) in_le32(addr)
+-#define writel(val,addr) out_le32((addr),(val))
++#define inl(port) in_be32(port)
++#define outl(val,port) out_be32((port),(val))
++#define readl(addr) in_be32(addr)
++#define writel(val,addr) out_be32((addr),(val))
+
+ /* those can be defined for both ISA and PCI - it won't work though */
+ #define readb(addr) in_8(addr)
+-#define readw(addr) in_le16(addr)
++#define readw(addr) in_be16(addr)
+ #define writeb(val,addr) out_8((addr),(val))
+-#define writew(val,addr) out_le16((addr),(val))
++#define writew(val,addr) out_be16((addr),(val))
+
+ #define readb_relaxed(addr) readb(addr)
+ #define readw_relaxed(addr) readw(addr)
+@@ -280,8 +280,12 @@ static inline void isa_delay(void)
+ #ifndef CONFIG_ISA
+ #define inb(port) in_8(port)
+ #define outb(val,port) out_8((port),(val))
+-#define inw(port) in_le16(port)
+-#define outw(val,port) out_le16((port),(val))
++#define inw(port) in_be16(port)
++#define outw(val,port) out_be16((port),(val))
++
++#define memset_io(a,b,c) memset((void *)(a),(b),(c))
++#define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c))
++#define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c))
+
+ #else
+ /*
+Index: linux-tmp/include/asm-m68k/pci.h
+===================================================================
+--- linux-tmp.orig/include/asm-m68k/pci.h 2005-06-14 02:49:00.475288428 +0200
++++ linux-tmp/include/asm-m68k/pci.h 2005-06-14 02:49:06.132323267 +0200
+@@ -1,39 +1,17 @@
+ #ifndef _ASM_M68K_PCI_H
+ #define _ASM_M68K_PCI_H
+
++#include <asm-generic/pci-dma-compat.h>
++#include <asm-generic/pci.h>
++
+ /*
+ * asm-m68k/pci_m68k.h - m68k specific PCI declarations.
+ *
+ * Written by Wout Klaren.
+ */
+
+-#include <asm/scatterlist.h>
+-
+-struct pci_ops;
+-
+-/*
+- * Structure with hardware dependent information and functions of the
+- * PCI bus.
+- */
+-
+-struct pci_bus_info
+-{
+- /*
+- * Resources of the PCI bus.
+- */
+-
+- struct resource mem_space;
+- struct resource io_space;
+-
+- /*
+- * System dependent functions.
+- */
+-
+- struct pci_ops *m68k_pci_ops;
+-
+- void (*fixup)(int pci_modify);
+- void (*conf_device)(struct pci_dev *dev);
+-};
++#define PCIBIOS_MIN_IO 0
++#define PCIBIOS_MIN_MEM 0
+
+ #define pcibios_assign_all_busses() 0
+ #define pcibios_scan_all_fns(a, b) 0
+@@ -54,6 +32,12 @@ static inline void pcibios_penalize_isa_
+ */
+ #define PCI_DMA_BUS_IS_PHYS (1)
+
++/*
++ * We don't support DAC DMA cycles.
++ */
++#define pci_dac_dma_supported(pci_dev, mask) (0)
++
++
+ static inline void pcibios_add_platform_entries(struct pci_dev *dev)
+ {
+ }
+Index: linux-tmp/arch/m68k/amiga/wildfire.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-tmp/arch/m68k/amiga/wildfire.c 2005-06-14 02:49:06.145321049 +0200
+@@ -0,0 +1,93 @@
++
++#include <linux/init.h>
++#include <linux/pci.h>
++
++#include <asm/amigaints.h>
++
++#define WF_AccCfg0 0x00
++#define WF_AccCfg1 0x08
++#define WF_IntrCntrl 0x10
++#define WF_IntReg0 0x20
++#define WF_IntReg1 0x28
++
++/* WF_AccCfg1 */
++#define WF_PCI_Rst 0x04
++#define WF_PCI_CfgCyc 0x02
++#define WF_AccelDsbl 0x01
++
++/* WF_IntrCntrl */
++#define WF_AccInt6En 0x80
++#define WF_SERR_IntEn 0x40
++#define WF_PERR_IntEn 0x20
++#define WF_MERR_IntEn 0x10
++#define WF_PwrUp 0x08
++
++/* WF_IntReg0 */
++#define WF_AccInt6 0x80
++#define WF_SERR_Int 0x40
++#define WF_PERR_Int 0x20
++#define WF_MERR_Int 0x10
++#define WF_MBPostWrErr 0x08
++#define WF_Dev_Int 0x04
++
++/* WF_IntReg1 */
++#define WF_PCI_Intr4 0x10
++#define WF_PCI_Intr3 0x08
++#define WF_PCI_Intr2 0x04
++#define WF_PCI_Intr1 0x02
++#define WF_PCI_Intr0 0x01
++
++static u8 *pci_conf_base, *wildfire_base;
++static int pci_dev_mask;
++
++void __init pcibios_fixup_bus(struct pci_bus *bus)
++{
++ struct pci_dev *dev;
++
++ printk("pcibios_fixup_bus\n");
++ list_for_each_entry(dev, &bus->devices, bus_list)
++ dev->irq = IRQ_WF_PCI_INT0 + PCI_SLOT(dev->devfn);
++}
++
++int pcibios_enable_device(struct pci_dev *dev, int mask)
++{
++ struct resource *r;
++ u16 cmd, old_cmd;
++ int idx;
++
++ printk("pcibios_enable_device: %x\n", mask);
++ pci_read_config_word(dev, PCI_COMMAND, &cmd);
++ old_cmd = cmd;
++ for (idx = 0; idx < 6; idx++) {
++ /* Only set up the requested stuff */
++ if (!(mask & (1 << idx)))
++ continue;
++ r = dev->resource + idx;
++ if (r->flags & IORESOURCE_IO)
++ cmd |= PCI_COMMAND_IO;
++ if (r->flags & IORESOURCE_MEM)
++ cmd |= PCI_COMMAND_MEMORY;
++ }
++ if (cmd != old_cmd) {
++ printk("PCI: enabling device %s (%04x -> %04x)\n",
++ dev->slot_name, old_cmd, cmd);
++ pci_write_config_word(dev, PCI_COMMAND, cmd);
++ }
++ return 0;
++}
++
++void pcibios_align_resource(void *data, struct resource *res,
++ unsigned long size, unsigned long align)
++{
++ if (res->flags & IORESOURCE_IO) {
++ unsigned long start = res->start;
++
++ if (start & 0x300)
++ res->start = (start + 0x3ff) & ~0x3ff;
++ }
++}
++
++char * __init pcibios_setup (char *str)
++{
++ return str;
++}
+Index: linux-tmp/arch/m68k/kernel/Makefile
+===================================================================
+--- linux-tmp.orig/arch/m68k/kernel/Makefile 2005-06-14 02:49:00.474288599 +0200
++++ linux-tmp/arch/m68k/kernel/Makefile 2005-06-14 02:49:06.145321049 +0200
+@@ -12,7 +12,6 @@ extra-y += vmlinux.lds
+ obj-y := entry.o process.o traps.o ints.o dma.o signal.o ptrace.o \
+ sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
+
+-obj-$(CONFIG_PCI) += bios32.o
+ obj-$(CONFIG_MODULES) += module.o
+
+ EXTRA_AFLAGS := -traditional
More information about the Kernel-svn-changes
mailing list