Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 56789
b: refs/heads/master
c: 38c425f
h: refs/heads/master
i:
  56787: 366a281
v: v3
  • Loading branch information
Paul Mundt committed May 14, 2007
1 parent 92c71e7 commit 807f17c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 42 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0facbe3a34556bbc30333971e32c5430b087fcb1
refs/heads/master: 38c425f69c8d949620384f917e00652eaf390ec9
79 changes: 38 additions & 41 deletions trunk/arch/sh/mm/pmb.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Privileged Space Mapping Buffer (PMB) Support.
*
* Copyright (C) 2005, 2006 Paul Mundt
* Copyright (C) 2005, 2006, 2007 Paul Mundt
*
* P1/P2 Section mapping definitions from map32.h, which was:
*
Expand Down Expand Up @@ -68,6 +68,32 @@ static inline unsigned long mk_pmb_data(unsigned int entry)
return mk_pmb_entry(entry) | PMB_DATA;
}

static DEFINE_SPINLOCK(pmb_list_lock);
static struct pmb_entry *pmb_list;

static inline void pmb_list_add(struct pmb_entry *pmbe)
{
struct pmb_entry **p, *tmp;

p = &pmb_list;
while ((tmp = *p) != NULL)
p = &tmp->next;

pmbe->next = tmp;
*p = pmbe;
}

static inline void pmb_list_del(struct pmb_entry *pmbe)
{
struct pmb_entry **p, *tmp;

for (p = &pmb_list; (tmp = *p); p = &tmp->next)
if (tmp == pmbe) {
*p = tmp->next;
return;
}
}

struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn,
unsigned long flags)
{
Expand All @@ -81,11 +107,19 @@ struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn,
pmbe->ppn = ppn;
pmbe->flags = flags;

spin_lock_irq(&pmb_list_lock);
pmb_list_add(pmbe);
spin_unlock_irq(&pmb_list_lock);

return pmbe;
}

void pmb_free(struct pmb_entry *pmbe)
{
spin_lock_irq(&pmb_list_lock);
pmb_list_del(pmbe);
spin_unlock_irq(&pmb_list_lock);

kmem_cache_free(pmb_cache, pmbe);
}

Expand Down Expand Up @@ -167,31 +201,6 @@ void clear_pmb_entry(struct pmb_entry *pmbe)
clear_bit(entry, &pmb_map);
}

static DEFINE_SPINLOCK(pmb_list_lock);
static struct pmb_entry *pmb_list;

static inline void pmb_list_add(struct pmb_entry *pmbe)
{
struct pmb_entry **p, *tmp;

p = &pmb_list;
while ((tmp = *p) != NULL)
p = &tmp->next;

pmbe->next = tmp;
*p = pmbe;
}

static inline void pmb_list_del(struct pmb_entry *pmbe)
{
struct pmb_entry **p, *tmp;

for (p = &pmb_list; (tmp = *p); p = &tmp->next)
if (tmp == pmbe) {
*p = tmp->next;
return;
}
}

static struct {
unsigned long size;
Expand Down Expand Up @@ -283,25 +292,14 @@ void pmb_unmap(unsigned long addr)
} while (pmbe);
}

static void pmb_cache_ctor(void *pmb, struct kmem_cache *cachep, unsigned long flags)
static void pmb_cache_ctor(void *pmb, struct kmem_cache *cachep,
unsigned long flags)
{
struct pmb_entry *pmbe = pmb;

memset(pmb, 0, sizeof(struct pmb_entry));

spin_lock_irq(&pmb_list_lock);

pmbe->entry = PMB_NO_ENTRY;
pmb_list_add(pmbe);

spin_unlock_irq(&pmb_list_lock);
}

static void pmb_cache_dtor(void *pmb, struct kmem_cache *cachep, unsigned long flags)
{
spin_lock_irq(&pmb_list_lock);
pmb_list_del(pmb);
spin_unlock_irq(&pmb_list_lock);
}

static int __init pmb_init(void)
Expand All @@ -312,8 +310,7 @@ static int __init pmb_init(void)
BUG_ON(unlikely(nr_entries >= NR_PMB_ENTRIES));

pmb_cache = kmem_cache_create("pmb", sizeof(struct pmb_entry), 0,
SLAB_PANIC, pmb_cache_ctor,
pmb_cache_dtor);
SLAB_PANIC, pmb_cache_ctor, NULL);

jump_to_P2();

Expand Down

0 comments on commit 807f17c

Please sign in to comment.