2003-03-25 Thomas Doerfler <Thomas.Doerfler@imd-systems.de>

PR 368/filesystem
	* ide/*: added BSP support for libchip standard ide driver
This commit is contained in:
Joel Sherrill
2003-03-25 18:17:25 +00:00
parent bf71e25ee4
commit 086e708d3f
11 changed files with 572 additions and 21 deletions

View File

@@ -1,3 +1,8 @@
2003-03-25 Thomas Doerfler <Thomas.Doerfler@imd-systems.de>
PR 368/filesystem
* ide/*: added BSP support for libchip standard ide driver
2003-03-06 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
* configure.ac: Remove AC_CONFIG_AUX_DIR.

View File

@@ -6,8 +6,8 @@ ACLOCAL_AMFLAGS = -I ../../../../../../aclocal
# wrapup is the one that actually builds and installs the library
# from the individual .rel files built in other directories
SUBDIRS = include clock console irq network startup vectors \
@exceptions@ wrapup
SUBDIRS = include clock console irq network ide startup vectors \
@exceptions@ wrapup
include $(top_srcdir)/../../bsp.am

View File

@@ -122,6 +122,7 @@ clock/Makefile
console/Makefile
include/Makefile
irq/Makefile
ide/Makefile
network/Makefile
startup/Makefile
vectors/Makefile

View File

@@ -0,0 +1,32 @@
##
## Makefile.am,v 1.5 2002/08/11 06:59:03 ralf Exp
##
PGM = # $(ARCH)/console.rel
C_FILES = idecfg.c pcmcia_ide.c
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.$(OBJEXT))
OBJS = $(C_O_FILES)
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../../../../../../automake/compile.am
include $(top_srcdir)/../../../../../../automake/lib.am
#
# (OPTIONAL) Add local stuff here using +=
#
$(PGM): $(OBJS)
$(make-rel)
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
all-local: $(ARCH) $(OBJS) $(PGM)
.PRECIOUS: $(PGM)
EXTRA_DIST = idecfg.c
include $(top_srcdir)/../../../../../../automake/local.am

View File

@@ -0,0 +1,51 @@
/*===============================================================*\
| Project: RTEMS MBX8xx IDE harddisc driver tables |
+-----------------------------------------------------------------+
| File: idecfg.c |
+-----------------------------------------------------------------+
| Copyright (c) 2003 IMD |
| Ingenieurbuero fuer Microcomputertechnik Th. Doerfler |
| <Thomas.Doerfler@imd-systems.de> |
| all rights reserved |
+-----------------------------------------------------------------+
| this file contains the table of functions for the BSP layer |
| for IDE access below the libchip IDE harddisc driver |
| |
+-----------------------------------------------------------------+
| date history ID |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 01.14.03 creation doe |
\*===============================================================*/
#include <rtems.h>
#include <bsp.h>
#include <bsp/mbx.h>
#include <mpc8xx.h>
#include <libchip/ide_ctrl.h>
#include <libchip/ide_ctrl_cfg.h>
#include <libchip/ide_ctrl_io.h>
/*
* The following table configures the IDE driver used in this BSP.
*/
extern ide_ctrl_fns_t mbx8xx_pcmciaide_ctrl_fns;
/* IDE controllers Table */
ide_controller_bsp_table_t IDE_Controller_Table[] = {
{"/dev/idepcmcia",
IDE_STD, /* PCMCIA Flash cards emulate standard IDE controller */
&mbx8xx_pcmciaide_ctrl_fns,
NULL, /* no BSP dependent probe needed */
FALSE, /* not (yet) initialized */
PCMCIA_MEM_ADDR, /* access address for register set */
FALSE,0, /* not (yet) interrupt driven */
NULL
}
};
/* Number of rows in IDE_Controller_Table */
unsigned long IDE_Controller_Count =
sizeof(IDE_Controller_Table)/sizeof(IDE_Controller_Table[0]);

View File

@@ -0,0 +1,385 @@
/*===============================================================*\
| Project: RTEMS MBX8xx PCMCIA IDE harddisc driver |
+-----------------------------------------------------------------+
| File: pcmcia_ide.c |
+-----------------------------------------------------------------+
| Copyright (c) 2003 IMD |
| Ingenieurbuero fuer Microcomputertechnik Th. Doerfler |
| <Thomas.Doerfler@imd-systems.de> |
| all rights reserved |
+-----------------------------------------------------------------+
| this file contains the BSP layer for PCMCIA IDE access below the|
| libchip IDE harddisc driver |
| based on a board specific driver from |
| Eugeny S. Mints, Oktet |
| |
| The license and distribution terms for this file may be |
| found in the file LICENSE in this distribution or at |
| http://www.OARcorp.com/rtems/license.html. |
| |
+-----------------------------------------------------------------+
| date history ID |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 01.14.03 creation doe |
\*===============================================================*/
#include <rtems.h>
#include <bsp.h>
#include <bsp/mbx.h>
#include <mpc8xx.h>
#include <libchip/ide_ctrl.h>
#include <libchip/ide_ctrl_cfg.h>
#include <libchip/ide_ctrl_io.h>
/* #define DATAREG_16BIT */ /* 16 bit mode not yet working */
/* #define DEBUG_OUT */
/*
* support functions for PCMCIA IDE IF
*/
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
boolean mbx8xx_pcmciaide_probe
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| This function should probe, whether a PCMCIA flash disk is available |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| TRUE, when flash disk available |
\*=========================================================================*/
{
boolean ide_card_plugged = TRUE; /* assume: we have a card plugged in */
/*
* check, that the CD# pins are low -> a PCMCIA card is plugged in
*/
if ((m8xx.pipr
& (M8xx_PCMCIA_PIPR_CACD1 | M8xx_PCMCIA_PIPR_CACD2)) != 0x00) {
ide_card_plugged = FALSE;
}
/*
* set supply voltage to 3.3V
* FIXME: this should be depending on state of VS1/2 pins
* FIXME: there should be a shadow variable for the BSP for CSR2 access
*/
*((volatile unsigned8 *)MBX_CSR2) = 0xb0;
/*
* check card information service whether card is a ATA like disk
* -> scan for tuple of type 0x21 with content 0x04 0xXX (fixed disk)
* -> scan for tuple of type 0x22 with content 0x01 0x01
*/
if (ide_card_plugged) {
#define CIS_BYTE(pos) (((unsigned8 *)PCMCIA_ATTRB_ADDR)[(pos)*2])
int cis_pos = 0;
boolean fixed_disk_tuple_found = FALSE;
boolean ata_disk_tuple_found = FALSE;
while ((cis_pos < 256) &&
(CIS_BYTE(cis_pos) != 0xff) &&
(!fixed_disk_tuple_found || !ata_disk_tuple_found)) {
/*
* check for neede tuples
*/
if ((CIS_BYTE(cis_pos ) == 0x21) &&
(CIS_BYTE(cis_pos+2) == 0x04)) {
fixed_disk_tuple_found = TRUE;
}
else if ((CIS_BYTE(cis_pos ) == 0x22) &&
(CIS_BYTE(cis_pos+2) == 0x01) &&
(CIS_BYTE(cis_pos+3) == 0x01)) {
ata_disk_tuple_found = TRUE;
}
/*
* advance using the length field
*/
cis_pos += CIS_BYTE(cis_pos+1)+2;
}
ide_card_plugged = fixed_disk_tuple_found && ata_disk_tuple_found;
}
return ide_card_plugged;
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
void mbx8xx_pcmciaide_initialize
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| initialize PCMCIA IDE flash card access |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor /* controller minor number */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| <none> |
\*=========================================================================*/
{
/*
* FIXME: enable interrupts, if needed
*/
/*
* FIXME: set programming voltage as requested
*/
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
void mbx8xx_pcmciaide_read_reg
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| read a PCMCIA IDE controller register |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor, /* controller minor number */
int reg, /* register index to access */
unsigned16 *value /* ptr to return value location */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| <none> |
\*=========================================================================*/
{
unsigned32 port = IDE_Controller_Table[minor].port1;
if (reg == IDE_REGISTER_DATA_WORD) {
#ifdef DATAREG_16BIT
*value = *(volatile unsigned16 *)(port+reg);
#else
*value = ((*(volatile unsigned8 *)(port+reg) << 8) +
(*(volatile unsigned8 *)(port+reg+1) ));
#endif
}
else {
*value = *(volatile unsigned8 *)(port+reg);
}
#ifdef DEBUG_OUT
printk("mbx8xx_pcmciaide_read_reg(0x%x)=0x%x\r\n",reg,*value & 0xff);
#endif
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
void mbx8xx_pcmciaide_write_reg
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| write a PCMCIA IDE controller register |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor, /* controller minor number */
int reg, /* register index to access */
unsigned16 value /* value to write */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| <none> |
\*=========================================================================*/
{
unsigned32 port = IDE_Controller_Table[minor].port1;
#ifdef DEBUG_OUT
printk("mbx8xx_pcmciaide_write_reg(0x%x,0x%x)\r\n",reg,value & 0xff);
#endif
if (reg == IDE_REGISTER_DATA_WORD) {
#ifdef DATAREG_16BIT
*(volatile unsigned16 *)(port+reg) = value;
#else
*(volatile unsigned8 *)(port+reg) = value >> 8;
*(volatile unsigned8 *)(port+reg+1) = value;
#endif
}
else {
*(volatile unsigned8 *)(port+reg)= value;
}
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
void mbx8xx_pcmciaide_read_block
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| read a PCMCIA IDE controller register |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor,
unsigned16 block_size,
blkdev_sg_buffer *bufs,
rtems_unsigned32 *cbuf,
rtems_unsigned32 *pos
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| <none> |
\*=========================================================================*/
{
unsigned32 port = IDE_Controller_Table[minor].port1;
unsigned16 cnt = 0;
#ifdef DEBUG_OUT
printk("mbx8xx_pcmciaide_read_block()\r\n");
#endif
#ifdef DATAREG_16BIT
unsigned16 *lbuf = (unsigned16 *)
((unsigned8 *)(bufs[(*cbuf)].buffer) + (*pos));
#else
unsigned8 *lbuf = (unsigned8 *)
((unsigned8 *)(bufs[(*cbuf)].buffer) + (*pos));
#endif
unsigned32 llength = bufs[(*cbuf)].length;
while (((*(volatile unsigned8 *)(port+IDE_REGISTER_STATUS))
& IDE_REGISTER_STATUS_DRQ) &&
(cnt < block_size)) {
#ifdef DATAREG_16BIT
*lbuf++ = *(volatile unsigned16 *)(port+8); /* 16 bit data port */
cnt += 2;
(*pos) += 2;
#else
*lbuf++ = *(volatile unsigned8 *)(port+IDE_REGISTER_DATA);
cnt += 1;
(*pos) += 1;
#endif
if ((*pos) == llength) {
(*pos) = 0;
(*cbuf)++;
lbuf = bufs[(*cbuf)].buffer;
llength = bufs[(*cbuf)].length;
}
}
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
void mbx8xx_pcmciaide_write_block
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| write a PCMCIA IDE controller register |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor,
unsigned16 block_size,
blkdev_sg_buffer *bufs,
rtems_unsigned32 *cbuf,
rtems_unsigned32 *pos
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| <none> |
\*=========================================================================*/
{
unsigned32 port = IDE_Controller_Table[minor].port1;
unsigned16 cnt = 0;
#ifdef DEBUG_OUT
printk("mbx8xx_pcmciaide_write_block()\r\n");
#endif
#ifdef DATA_REG_16BIT
unsigned16 *lbuf = (unsigned16 *)
((unsigned8 *)(bufs[(*cbuf)].buffer) + (*pos));
#else
unsigned8 *lbuf = (unsigned8 *)
((unsigned8 *)(bufs[(*cbuf)].buffer) + (*pos));
#endif
unsigned32 llength = bufs[(*cbuf)].length;
while (((*(volatile unsigned8 *)(port+IDE_REGISTER_STATUS))
& IDE_REGISTER_STATUS_DRQ) &&
(cnt < block_size)) {
#ifdef DATAREG_16BIT
*(volatile unsigned16 *)(port+8) = *lbuf++; /* 16 bit data port */
cnt += 2;
(*pos) += 2;
#else
*(volatile unsigned8 *)(port+IDE_REGISTER_DATA) = *lbuf++;
cnt += 1;
(*pos) += 1;
#endif
if ((*pos) == llength) {
(*pos) = 0;
(*cbuf)++;
lbuf = bufs[(*cbuf)].buffer;
llength = bufs[(*cbuf)].length;
}
}
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
int mbx8xx_pcmciaide_control
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| control interface for controller |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor, /* controller minor number */
unsigned32 cmd, /* command to send */
void * arg /* optional argument */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| <none> |
\*=========================================================================*/
{
return 0;
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
rtems_status_code mbx8xx_pcmciaide_config_io_speed
(
/*-------------------------------------------------------------------------*\
| Purpose: |
| set up transfer speed, if possible |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int minor, /* controller minor number */
unsigned8 modes_avail /* optional argument */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| rtems_status_code |
\*=========================================================================*/
{
return RTEMS_SUCCESSFUL;
}
/*
* The following table configures the functions used for IDE drivers
* in this BSP.
*/
ide_ctrl_fns_t mbx8xx_pcmciaide_ctrl_fns = {
mbx8xx_pcmciaide_probe,
mbx8xx_pcmciaide_initialize,
mbx8xx_pcmciaide_control,
mbx8xx_pcmciaide_read_reg,
mbx8xx_pcmciaide_write_reg,
mbx8xx_pcmciaide_read_block,
mbx8xx_pcmciaide_write_block,
mbx8xx_pcmciaide_config_io_speed
};

View File

@@ -112,6 +112,11 @@ extern rtems_configuration_table BSP_Configuration;
* NOTE: Use the standard Clock driver entry
*/
/*
* indicate, that BSP has IDE driver
*/
#define RTEMS_BSP_HAS_IDE_DRIVER
/*
* How many libio files we want
*/

View File

@@ -59,4 +59,6 @@ typedef struct bd_info {
#define IMAP_SIZE ((unsigned int)(64 * 1024))
#define PCI_CSR_ADDR ((unsigned int)0xfa210000)
#define PCI_CSR_SIZE ((unsigned int)(64 * 1024))
#define MBX_CSR2 (MBX_CSR_ADDR+1)
#endif

View File

@@ -11,6 +11,7 @@
*/
#include <bsp.h>
#include <bsp/mbx.h>
/*
* EPPCBug rev 1.1 is stupid. It clears the interrupt mask register
@@ -156,11 +157,6 @@ void _InitMBX8xx (void)
register unsigned32 r1, i;
extern unsigned32 simask_copy;
/*
* Get the SIU interrupt mask.
*/
simask_copy = m8xx.simask;
/*
* Initialize the Debug Enable Register (DER) to an appropriate
* value for EPPCBug debugging.
@@ -213,6 +209,12 @@ void _InitMBX8xx (void)
r1 = 0xFA200000;
_mtspr( M8xx_IMMR, r1 );
/*
* Get the SIU interrupt mask.
* imd: accessing m8xx.* should not occure before setting up the immr !
*/
simask_copy = m8xx.simask;
/*
* Initialize the SIU Module Configuration Register (SIUMCR)
* m8xx.siumcr = 0x00602900, the default MBX and firmware value.
@@ -274,7 +276,16 @@ void _InitMBX8xx (void)
m8xx.plprck = M8xx_UNLOCK_KEY; /* unlock PLPRCR */
#if ( defined(mbx821_001) || defined(mbx821_001b) || defined(mbx860_001b) )
m8xx.plprcr = 0x5F500000;
#elif ( defined(mbx860_005b) )
#elif ( defined(mbx860_005b) || \
defined(mbx860_002b) || \
defined(mbx860_003b) || \
defined(mbx860_004b) || \
defined(mbx860_006b) || \
defined(mbx821_002b) || \
defined(mbx821_003b) || \
defined(mbx821_004b) || \
defined(mbx821_005b) || \
defined(mbx821_006b) )
/* Set the multiplication factor to 0 and clear the timer interrupt status*/
m8xx.plprcr = 0x00005000;
#elif ( defined(mbx860_001) || \
@@ -282,19 +293,10 @@ void _InitMBX8xx (void)
defined(mbx860_003) || \
defined(mbx860_004) || \
defined(mbx860_005) || \
defined(mbx860_002b) || \
defined(mbx860_003b) || \
defined(mbx860_004b) || \
defined(mbx860_006b) || \
defined(mbx821_002) || \
defined(mbx821_003) || \
defined(mbx821_004) || \
defined(mbx821_005) || \
defined(mbx821_002b) || \
defined(mbx821_003b) || \
defined(mbx821_004b) || \
defined(mbx821_005b) || \
defined(mbx821_006b) )
defined(mbx821_005))
m8xx.plprcr = 0x4C400000;
#else
#error "MBX board not defined"
@@ -582,4 +584,52 @@ void _InitMBX8xx (void)
#endif
m8xx.memc[7]._br = M8xx_BR_BA(0xFC000000) | M8xx_BR_AT(0) | M8xx_BR_PS8 |
M8xx_BR_MS_GPCM | M8xx_MEMC_BR_V;
/*
* PCMCIA initialization
*/
/*
* PCMCIA region 0: common memory
*/
m8xx.pbr0 = PCMCIA_MEM_ADDR;
m8xx.por0 = (M8xx_PCMCIA_POR_BSIZE_64MB
| M8xx_PCMCIA_POR_PSHT(15) | M8xx_PCMCIA_POR_PSST(15)
| M8xx_PCMCIA_POR_PSL(32)
| M8xx_PCMCIA_POR_PPS_16 | M8xx_PCMCIA_POR_PRS_MEM
|M8xx_PCMCIA_POR_PSLOT_A | M8xx_PCMCIA_POR_VALID);
/*
* PCMCIA region 1: dma memory
*/
m8xx.pbr1 = PCMCIA_DMA_ADDR;
m8xx.por1 = (M8xx_PCMCIA_POR_BSIZE_64MB
| M8xx_PCMCIA_POR_PSHT(15) | M8xx_PCMCIA_POR_PSST(15)
| M8xx_PCMCIA_POR_PSL(32)
| M8xx_PCMCIA_POR_PPS_16 | M8xx_PCMCIA_POR_PRS_DMA
|M8xx_PCMCIA_POR_PSLOT_A | M8xx_PCMCIA_POR_VALID);
/*
* PCMCIA region 2: attribute memory
*/
m8xx.pbr2 = PCMCIA_ATTRB_ADDR;
m8xx.por2 = (M8xx_PCMCIA_POR_BSIZE_64MB
| M8xx_PCMCIA_POR_PSHT(15) | M8xx_PCMCIA_POR_PSST(15)
| M8xx_PCMCIA_POR_PSL(32)
| M8xx_PCMCIA_POR_PPS_16 | M8xx_PCMCIA_POR_PRS_ATT
|M8xx_PCMCIA_POR_PSLOT_A | M8xx_PCMCIA_POR_VALID);
/*
* PCMCIA region 3: I/O access
*/
m8xx.pbr3 = PCMCIA_IO_ADDR;
m8xx.por3 = (M8xx_PCMCIA_POR_BSIZE_64MB
| M8xx_PCMCIA_POR_PSHT(15) | M8xx_PCMCIA_POR_PSST(15)
| M8xx_PCMCIA_POR_PSL(32)
| M8xx_PCMCIA_POR_PPS_16 | M8xx_PCMCIA_POR_PRS_IO
|M8xx_PCMCIA_POR_PSLOT_A | M8xx_PCMCIA_POR_VALID);
/*
* PCMCIA interface general control reg
*/
m8xx.pgcra = 0; /* no special options set */
/*
* PCMCIA interface enable reg
*/
m8xx.per =0; /* no interrupts enabled now */
}

View File

@@ -12,7 +12,7 @@
#include <bsp.h>
#include <mpc8xx/mmu.h>
#include <bsp/mbx.h>
/*
* This MMU_TLB_table is used to statically initialize the Table Lookaside
* Buffers in the MMU of the MBX8xx board.
@@ -166,7 +166,27 @@ MMU_TLB_table_t MMU_TLB_table[] = {
* R/W,X for all, no ASID comparison, cache-inhibited.
* EPN TWC RPN
*/
{ 0xFA210200, 0x11, 0xFA2109F7 } /* QSPAN - PS=4K */
{ 0xFA210200, 0x11, 0xFA2109F7 }, /* QSPAN - PS=4K */
/*
*
* PCMCIA Spaces: Start address 0xE0000000, 256M?
* For each space (MEM/DMA/ATTRIB/IO) only the first 8MB are mapped
* ASID=0x0, APG=0x0, guarded memory,
* R/W,X for all, no ASID comparison, cache-inhibited.
* EPN TWC
* RPN
*/
{ (PCMCIA_MEM_ADDR & 0xfffff000) | 0x200, 0x1D,
(PCMCIA_MEM_ADDR & 0xfffff000) | 0x9F7 },/* PCMCIA Memory - PS=8M */
{ (PCMCIA_DMA_ADDR & 0xfffff000) | 0x200, 0x1D,
(PCMCIA_DMA_ADDR & 0xfffff000) | 0x9F7 },/* PCMCIA DMA - PS=8M */
{ (PCMCIA_ATTRB_ADDR & 0xfffff000) | 0x200, 0x1D,
(PCMCIA_ATTRB_ADDR & 0xfffff000) | 0x9F7 },/* PCMCIA ATTRIB-PS=8M*/
{ (PCMCIA_IO_ADDR & 0xfffff000) | 0x200, 0x1D,
(PCMCIA_IO_ADDR & 0xfffff000) | 0x9F7 } /* PCMCIA I/O - PS=8M */
};
/*

View File

@@ -7,7 +7,7 @@ if HAS_NETWORKING
NETWORKING = network
endif
BSP_PIECES = clock irq startup console vectors $(NETWORKING)
BSP_PIECES = clock irq ide startup console vectors $(NETWORKING)
# pieces to pick up out of libcpu/ppc
# CPU_PIECES = mpc8xx/clock mpc8xx/console-generic mpc8xx/cpm \
# mpc8xx/mmu mpc8xx/timer mpc8xx/vectors