version 1.20.24.1, 2011/01/07 02:00:21 |
version 1.21, 2010/02/25 23:31:48 |
Line 48 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 48 __KERNEL_RCSID(0, "$NetBSD$"); |
|
|
|
#if defined (PPC_OEA) || defined(PPC_OEA64) || defined (PPC_OEA64_BRIDGE) |
#if defined (PPC_OEA) || defined(PPC_OEA64) || defined (PPC_OEA64_BRIDGE) |
#include <powerpc/spr.h> |
#include <powerpc/spr.h> |
#include <powerpc/oea/spr.h> |
|
#include <powerpc/oea/bat.h> |
#include <powerpc/oea/bat.h> |
#include <powerpc/oea/cpufeat.h> |
#include <powerpc/oea/cpufeat.h> |
#include <powerpc/oea/pte.h> |
#include <powerpc/oea/pte.h> |
|
#include <powerpc/oea/spr.h> |
#include <powerpc/oea/sr_601.h> |
#include <powerpc/oea/sr_601.h> |
|
|
extern unsigned long oeacpufeat; |
extern unsigned long oeacpufeat; |
|
|
bus_space_init(struct powerpc_bus_space *t, const char *extent_name, |
bus_space_init(struct powerpc_bus_space *t, const char *extent_name, |
void *storage, size_t storage_size) |
void *storage, size_t storage_size) |
{ |
{ |
if (t->pbs_extent == NULL && extent_name != NULL) { |
if (t->pbs_extent == NULL) { |
t->pbs_extent = extent_create(extent_name, t->pbs_base, |
t->pbs_extent = extent_create(extent_name, t->pbs_base, |
t->pbs_limit-1, M_DEVBUF, storage, storage_size, |
t->pbs_limit-1, M_DEVBUF, storage, storage_size, |
EX_NOCOALESCE|EX_NOWAIT); |
EX_NOCOALESCE|EX_NOWAIT); |
Line 535 memio_map(bus_space_tag_t t, bus_addr_t |
|
Line 535 memio_map(bus_space_tag_t t, bus_addr_t |
|
return (EOPNOTSUPP); |
return (EOPNOTSUPP); |
} |
} |
|
|
if (t->pbs_extent != NULL) { |
|
#ifdef PPC_IBM4XX |
#ifdef PPC_IBM4XX |
/* |
/* |
* XXX: Temporary kludge. |
* XXX: Temporary kludge. |
* Don't bother checking the extent during very early bootstrap. |
* Don't bother checking the extent during very early bootstrap. |
*/ |
*/ |
if (extent_flags) { |
if (extent_flags) { |
#endif |
#endif |
/* |
/* |
* Before we go any further, let's make sure that this |
* Before we go any further, let's make sure that this |
* region is available. |
* region is available. |
*/ |
*/ |
error = extent_alloc_region(t->pbs_extent, bpa, size, |
error = extent_alloc_region(t->pbs_extent, bpa, size, |
EX_NOWAIT | extent_flags); |
EX_NOWAIT | extent_flags); |
if (error) { |
if (error) { |
#ifdef DEBUG |
#ifdef DEBUG |
printf("bus_space_map(%p[%x:%x], %#x, %#x) failed" |
printf("bus_space_map(%p[%x:%x], %#x, %#x) failed: %d\n", |
": %d\n", |
t, t->pbs_base, t->pbs_limit, bpa, size, error); |
t, t->pbs_base, t->pbs_limit, bpa, size, error); |
|
#endif |
#endif |
return (error); |
return (error); |
} |
} |
#ifdef PPC_IBM4XX |
#ifdef PPC_IBM4XX |
} |
|
#endif |
|
} |
} |
|
#endif |
|
|
pa = t->pbs_offset + bpa; |
pa = t->pbs_offset + bpa; |
#if defined (PPC_OEA) || defined(PPC_OEA601) |
#if defined (PPC_OEA) || defined(PPC_OEA601) |
Line 591 memio_map(bus_space_tag_t t, bus_addr_t |
|
Line 588 memio_map(bus_space_tag_t t, bus_addr_t |
|
} |
} |
#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ |
#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ |
|
|
if (t->pbs_extent != NULL) { |
#ifndef PPC_IBM4XX |
#if !defined(PPC_IBM4XX) |
|
if (extent_flags == 0) { |
if (extent_flags == 0) { |
extent_free(t->pbs_extent, bpa, size, EX_NOWAIT); |
extent_free(t->pbs_extent, bpa, size, EX_NOWAIT); |
#ifdef DEBUG |
#ifdef DEBUG |
Line 602 memio_map(bus_space_tag_t t, bus_addr_t |
|
Line 598 memio_map(bus_space_tag_t t, bus_addr_t |
|
return (ENOMEM); |
return (ENOMEM); |
} |
} |
#endif |
#endif |
} |
|
|
|
/* |
/* |
* Map this into the kernel pmap. |
* Map this into the kernel pmap. |
*/ |
*/ |
Line 666 memio_unmap(bus_space_tag_t t, bus_space |
|
Line 660 memio_unmap(bus_space_tag_t t, bus_space |
|
#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ |
#endif /* defined (PPC_OEA) || defined(PPC_OEA601) */ |
bpa = pa - t->pbs_offset; |
bpa = pa - t->pbs_offset; |
|
|
if (t->pbs_extent != NULL |
if (extent_free(t->pbs_extent, bpa, size, EX_NOWAIT | extent_flags)) { |
&& extent_free(t->pbs_extent, bpa, size, |
|
EX_NOWAIT | extent_flags)) { |
|
printf("memio_unmap: %s 0x%lx, size 0x%lx\n", |
printf("memio_unmap: %s 0x%lx, size 0x%lx\n", |
(t->pbs_flags & _BUS_SPACE_IO_TYPE) ? "port" : "mem", |
(t->pbs_flags & _BUS_SPACE_IO_TYPE) ? "port" : "mem", |
(unsigned long)bpa, (unsigned long)size); |
(unsigned long)bpa, (unsigned long)size); |
Line 690 memio_alloc(bus_space_tag_t t, bus_addr_ |
|
Line 682 memio_alloc(bus_space_tag_t t, bus_addr_ |
|
size = _BUS_SPACE_STRIDE(t, size); |
size = _BUS_SPACE_STRIDE(t, size); |
rstart = _BUS_SPACE_STRIDE(t, rstart); |
rstart = _BUS_SPACE_STRIDE(t, rstart); |
|
|
if (t->pbs_extent == NULL) |
|
return ENOMEM; |
|
|
|
if (rstart + size > t->pbs_limit) { |
if (rstart + size > t->pbs_limit) { |
#ifdef DEBUG |
#ifdef DEBUG |
printf("%s(%p[%x:%x], %#x, %#x) failed: EINVAL\n", |
printf("%s(%p[%x:%x], %#x, %#x) failed: EINVAL\n", |
Line 751 memio_alloc(bus_space_tag_t t, bus_addr_ |
|
Line 740 memio_alloc(bus_space_tag_t t, bus_addr_ |
|
void |
void |
memio_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) |
memio_free(bus_space_tag_t t, bus_space_handle_t bsh, bus_size_t size) |
{ |
{ |
if (t->pbs_extent == NULL) |
|
return; |
|
|
|
/* memio_unmap() does all that we need to do. */ |
/* memio_unmap() does all that we need to do. */ |
memio_unmap(t, bsh, size); |
memio_unmap(t, bsh, size); |
} |
} |