All of lore.kernel.org
 help / color / mirror / Atom feed
From: Haavard Skinnemoen <hskinnemoen@atmel.com>
To: linux-arch@vger.kernel.org
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Subject: [PATCH 13/13] Generic ioremap_page_range: x86_64 conversion
Date: Tue, 08 Aug 2006 14:23:15 +0200	[thread overview]
Message-ID: <11550397963540-git-send-email-hskinnemoen@atmel.com> (raw)
In-Reply-To: <11550397961392-git-send-email-hskinnemoen@atmel.com>

Convert x86_64 to use generic ioremap_page_range()

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
---
 arch/x86_64/mm/ioremap.c |  110 +++-------------------------------------------
 1 files changed, 6 insertions(+), 104 deletions(-)

diff --git a/arch/x86_64/mm/ioremap.c b/arch/x86_64/mm/ioremap.c
index 45d7d82..6bb0712 100644
--- a/arch/x86_64/mm/ioremap.c
+++ b/arch/x86_64/mm/ioremap.c
@@ -12,117 +12,15 @@ #include <linux/vmalloc.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/module.h>
-#include <asm/io.h>
+#include <linux/io.h>
 #include <asm/pgalloc.h>
 #include <asm/fixmap.h>
-#include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
 #include <asm/proto.h>
 
 #define ISA_START_ADDRESS      0xa0000
 #define ISA_END_ADDRESS                0x100000
 
-static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size,
-	unsigned long phys_addr, unsigned long flags)
-{
-	unsigned long end;
-	unsigned long pfn;
-
-	address &= ~PMD_MASK;
-	end = address + size;
-	if (end > PMD_SIZE)
-		end = PMD_SIZE;
-	if (address >= end)
-		BUG();
-	pfn = phys_addr >> PAGE_SHIFT;
-	do {
-		if (!pte_none(*pte)) {
-			printk("remap_area_pte: page already exists\n");
-			BUG();
-		}
-		set_pte(pte, pfn_pte(pfn, __pgprot(_PAGE_PRESENT | _PAGE_RW | 
-					_PAGE_GLOBAL | _PAGE_DIRTY | _PAGE_ACCESSED | flags)));
-		address += PAGE_SIZE;
-		pfn++;
-		pte++;
-	} while (address && (address < end));
-}
-
-static inline int remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size,
-	unsigned long phys_addr, unsigned long flags)
-{
-	unsigned long end;
-
-	address &= ~PUD_MASK;
-	end = address + size;
-	if (end > PUD_SIZE)
-		end = PUD_SIZE;
-	phys_addr -= address;
-	if (address >= end)
-		BUG();
-	do {
-		pte_t * pte = pte_alloc_kernel(pmd, address);
-		if (!pte)
-			return -ENOMEM;
-		remap_area_pte(pte, address, end - address, address + phys_addr, flags);
-		address = (address + PMD_SIZE) & PMD_MASK;
-		pmd++;
-	} while (address && (address < end));
-	return 0;
-}
-
-static inline int remap_area_pud(pud_t * pud, unsigned long address, unsigned long size,
-	unsigned long phys_addr, unsigned long flags)
-{
-	unsigned long end;
-
-	address &= ~PGDIR_MASK;
-	end = address + size;
-	if (end > PGDIR_SIZE)
-		end = PGDIR_SIZE;
-	phys_addr -= address;
-	if (address >= end)
-		BUG();
-	do {
-		pmd_t * pmd = pmd_alloc(&init_mm, pud, address);
-		if (!pmd)
-			return -ENOMEM;
-		remap_area_pmd(pmd, address, end - address, address + phys_addr, flags);
-		address = (address + PUD_SIZE) & PUD_MASK;
-		pud++;
-	} while (address && (address < end));
-	return 0;
-}
-
-static int remap_area_pages(unsigned long address, unsigned long phys_addr,
-				 unsigned long size, unsigned long flags)
-{
-	int error;
-	pgd_t *pgd;
-	unsigned long end = address + size;
-
-	phys_addr -= address;
-	pgd = pgd_offset_k(address);
-	flush_cache_all();
-	if (address >= end)
-		BUG();
-	do {
-		pud_t *pud;
-		pud = pud_alloc(&init_mm, pgd, address);
-		error = -ENOMEM;
-		if (!pud)
-			break;
-		if (remap_area_pud(pud, address, end - address,
-					 phys_addr + address, flags))
-			break;
-		error = 0;
-		address = (address + PGDIR_SIZE) & PGDIR_MASK;
-		pgd++;
-	} while (address && (address < end));
-	flush_tlb_all();
-	return error;
-}
-
 /*
  * Fix up the linear direct mapping of the kernel to avoid cache attribute
  * conflicts.
@@ -165,6 +63,7 @@ void __iomem * __ioremap(unsigned long p
 	void * addr;
 	struct vm_struct * area;
 	unsigned long offset, last_addr;
+	pgprot_t pgprot;
 
 	/* Don't allow wraparound or zero size */
 	last_addr = phys_addr + size - 1;
@@ -194,6 +93,8 @@ #ifdef CONFIG_FLATMEM
 	}
 #endif
 
+	pgprot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_GLOBAL
+			  | _PAGE_DIRTY | _PAGE_ACCESSED | flags);
 	/*
 	 * Mappings have to be page-aligned
 	 */
@@ -209,7 +110,8 @@ #endif
 		return NULL;
 	area->phys_addr = phys_addr;
 	addr = area->addr;
-	if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) {
+	if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
+			       phys_addr, pgprot)) {
 		remove_vm_area((void *)(PAGE_MASK & (unsigned long) addr));
 		return NULL;
 	}
-- 
1.4.0


  reply	other threads:[~2006-08-08 12:23 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-08 12:23 [PATCH 0/13] Generic ioremap_page_range: introduction Haavard Skinnemoen
2006-08-08 12:23 ` [PATCH 1/13] Generic ioremap_page_range: implementation Haavard Skinnemoen
2006-08-08 12:23   ` [PATCH 2/13] Generic ioremap_page_range: alpha conversion Haavard Skinnemoen
2006-08-08 12:23     ` [PATCH 3/13] Generic ioremap_page_range: arm conversion Haavard Skinnemoen
2006-08-08 12:23       ` [PATCH 4/13] Generic ioremap_page_range: avr32 conversion Haavard Skinnemoen
2006-08-08 12:23         ` [PATCH 5/13] Generic ioremap_page_range: cris conversion Haavard Skinnemoen
2006-08-08 12:23           ` [PATCH 6/13] Generic ioremap_page_range: i386 conversion Haavard Skinnemoen
2006-08-08 12:23             ` [PATCH 7/13] Generic ioremap_page_range: m32r conversion Haavard Skinnemoen
2006-08-08 12:23               ` [PATCH 8/13] Generic ioremap_page_range: mips conversion Haavard Skinnemoen
2006-08-08 12:23                 ` [PATCH 9/13] Generic ioremap_page_range: parisc conversion Haavard Skinnemoen
2006-08-08 12:23                   ` [PATCH 10/13] Generic ioremap_page_range: s390 conversion Haavard Skinnemoen
2006-08-08 12:23                     ` [PATCH 11/13] Generic ioremap_page_range: sh conversion Haavard Skinnemoen
2006-08-08 12:23                       ` [PATCH 12/13] Generic ioremap_page_range: sh64 conversion Haavard Skinnemoen
2006-08-08 12:23                         ` Haavard Skinnemoen [this message]
2006-08-08 12:28                           ` [PATCH 13/13] Generic ioremap_page_range: x86_64 conversion Andi Kleen
2006-08-08 12:30                             ` Jan-Benedict Glaw
2006-08-08 14:38                   ` [PATCH 9/13] Generic ioremap_page_range: parisc conversion Kyle McMartin
2006-08-08 14:48                   ` Kyle McMartin
2006-08-08 15:13                     ` Haavard Skinnemoen
2006-08-08 15:37                     ` James Bottomley
2006-08-08 22:26 ` [PATCH 0/13] Generic ioremap_page_range: introduction David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11550397963540-git-send-email-hskinnemoen@atmel.com \
    --to=hskinnemoen@atmel.com \
    --cc=linux-arch@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.