Fixes and changes from Hauke Fath <hauke@Espresso.Rhein-Neckar.DE>.

* Clean up after briggs@ changes to support bus_dma.
* Add support for reading sMemory resources from nubus cards.
* Add support for old cards with only the board rsrc (NatSemi NB-GPIB, e.g.)
* Add a few more card identifiers.
This commit is contained in:
briggs 2002-04-13 17:49:41 +00:00
parent f1cd70e3dc
commit 652b9e4c7b
3 changed files with 152 additions and 15 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: mainbus.c,v 1.10 2002/04/10 04:38:49 briggs Exp $ */
/* $NetBSD: mainbus.c,v 1.11 2002/04/13 17:49:41 briggs Exp $ */
/*
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@ -110,7 +110,7 @@ mainbus_search(parent, cf, aux)
struct cfdata *cf;
void *aux;
{
if ((*cf->cf_attach->ca_match)(parent, cf, NULL) > 0)
config_attach(parent, cf, NULL, NULL);
if ((*cf->cf_attach->ca_match)(parent, cf, aux) > 0)
config_attach(parent, cf, aux, NULL);
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nubus.c,v 1.52 2002/04/10 04:38:50 briggs Exp $ */
/* $NetBSD: nubus.c,v 1.53 2002/04/13 17:49:41 briggs Exp $ */
/*
* Copyright (c) 1995, 1996 Allen Briggs. All rights reserved.
@ -31,6 +31,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/device.h>
#include <sys/buf.h>
#include <sys/conf.h>
@ -50,7 +51,7 @@
#define NDB_PROBE 0x1
#define NDB_FOLLOW 0x2
#define NDB_ARITH 0x4
static int nubus_debug = 0 /* | NDB_PROBE */;
static int nubus_debug = 0 /* | NDB_PROBE | NDB_FOLLOW | NDB_ARITH */ ;
#endif
static int nubus_print __P((void *, const char *));
@ -99,7 +100,7 @@ nubus_attach(parent, self, aux)
void *aux;
{
struct nubus_attach_args na_args;
struct mainbus_attach_args *mba = (struct mainbus_attach_args *) mba;
struct mainbus_attach_args *mba;
bus_space_tag_t bst;
bus_space_handle_t bsh;
nubus_slot fmtblock;
@ -110,6 +111,9 @@ nubus_attach(parent, self, aux)
int i, rsrcid;
u_int8_t lanes;
mba = aux;
KASSERT(NULL != mba->mba_dmat);
printf("\n");
for (i = NUBUS_MIN_SLOT; i <= NUBUS_MAX_SLOT; i++) {
@ -148,10 +152,16 @@ notfound:
* of video resources given to us by the booter. If that
* doesn't work either, take the first resource following
* the board resource.
* If we only find a board resource, report that.
* There are cards that do not have anything else; their
* driver then has to match on the board resource and
* the card name.
*/
if (nubus_find_rsrc(bst, bsh,
&fmtblock, &dir, rsrcid, &dirent) <= 0) {
if ((rsrcid = nubus_video_resource(i)) == -1) {
int has_board_rsrc = 0;
/*
* Since nubus_find_rsrc failed, the directory
* is back at its base.
@ -161,21 +171,27 @@ notfound:
/*
* All nubus cards should have a board
* resource, but be sure that's what it
* is before we skip it.
* is before we skip it, and note the fact.
*/
rsrcid = nubus_read_1(bst, bsh,
lanes, entry);
if (rsrcid == 0x1)
if (rsrcid == 0x1) {
has_board_rsrc = 1;
entry = nubus_adjust_ptr(lanes,
dir.curr_ent, 4);
}
rsrcid = nubus_read_1(bst, bsh, lanes, entry);
/* end of chain? */
if (rsrcid == 0xff) {
if (!has_board_rsrc)
goto notfound;
else
rsrcid = 0x01;
}
#ifdef DEBUG
if (nubus_debug & NDB_FOLLOW)
printf("\tUsing rsrc 0x%x.\n", rsrcid);
#endif
if (rsrcid == 0xff) /* end of chain */
goto notfound;
}
/*
* Try to find the resource passed by the booter
@ -719,6 +735,63 @@ nubus_get_c_string(bst, bsh, fmt, dirent, data_return, max_bytes)
return 0;
}
/*
* Get list of address ranges for an sMemory resource
* -> DC&D, p.171
*/
int
nubus_get_smem_addr_rangelist(bst, bsh, fmt, dirent, data_return)
bus_space_tag_t bst;
bus_space_handle_t bsh;
nubus_slot *fmt;
nubus_dirent *dirent;
caddr_t data_return;
{
u_long loc;
u_int8_t lanes = fmt->bytelanes;
long blocklen;
caddr_t blocklist;
#ifdef DEBUG
if (nubus_debug & NDB_FOLLOW)
printf("nubus_get_smem_addr_rangelist(%p, %p, %p).\n",
fmt, dirent, data_return);
#endif
if ((loc = dirent->offset) & 0x800000) {
loc |= 0xff000000;
}
loc = nubus_adjust_ptr(lanes, dirent->myloc, loc);
/* Obtain the block length from the head of the list */
blocklen = nubus_read_4(bst, bsh, lanes, loc);
/*
* malloc a block of (blocklen) bytes
* caller must recycle block after use
*/
MALLOC(blocklist,caddr_t,blocklen,M_TEMP,M_WAITOK);
/* read ((blocklen - 4) / 8) (length,offset) pairs into block */
nubus_get_ind_data(bst, bsh, fmt, dirent, blocklist, blocklen);
#ifdef DEBUG
if (nubus_debug & NDB_FOLLOW) {
int ii;
nubus_smem_rangelist *rlist;
rlist = (nubus_smem_rangelist *)blocklist;
printf("\tblock@%p, len 0x0%X\n", rlist, rlist->length);
for (ii=0; ii < ((blocklen - 4) / 8); ii++) {
printf("\tRange %d: base addr 0x%X [0x%X]\n", ii,
rlist->range[ii].offset, rlist->range[ii].length);
}
}
#endif
*(caddr_t *)data_return = blocklist;
return 1;
}
static char *huh = "???";
char *
@ -794,7 +867,7 @@ nubus_scan_slot(bst, slotno)
bus_space_handle_t sc_bsh;
if (bus_space_map(bst, NUBUS_SLOT2PA(slotno), NBMEMSIZE, 0, &sc_bsh)) {
printf("nubus_scan_slot: failed to map slot %d\n", slotno);
printf("nubus_scan_slot: failed to map slot %x\n", slotno);
return;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: nubus.h,v 1.56 2002/04/10 04:38:50 briggs Exp $ */
/* $NetBSD: nubus.h,v 1.57 2002/04/13 17:49:41 briggs Exp $ */
/*
* Copyright (c) 1995 Allen Briggs. All rights reserved.
@ -46,18 +46,24 @@
#include <machine/cpu.h>
#define NUBUS_CATEGORY_BOARD 0x0001
#define NUBUS_TYPE_BOARD 0x0000 /* We want these for minimal board */
#define NUBUS_DRSW_BOARD 0x0000 /* ROMs that come with nothing but */
#define NUBUS_DRHW_BOARD 0x0000 /* a board resource (old NI_GPIB) */
#define NUBUS_CATEGORY_DISPLAY 0x0003
#define NUBUS_TYPE_VIDEO 0x0001
#define NUBUS_TYPE_LCD 0x0002
#define NUBUS_DRSW_APPLE 0x0001
#define NUBUS_DRHW_TFB 0x0001 /* Apple Toby Frame Buffer */
#define NUBUS_DRHW_BAER 0x0002 /* Formac Baers color card */
#define NUBUS_DRHW_WVC 0x0006 /* Apple Workstation Video Card */
#define NUBUS_DRHW_COLORMAX 0x0007 /* Sigma Designs ColorMax */
#define NUBUS_DRHW_SE30 0x0009 /* Apple SE/30 pseudo-slot video */
#define NUBUS_DRHW_M2HRVC 0x0013 /* Apple Mac II High-Res Video Card */
#define NUBUS_DRHW_PVC 0x0017 /* Apple Mac II Portrait Video Card */
#define NUBUS_DRHW_MDC 0x0019 /* Apple Macintosh Display Card */
#define NUBUS_DRHW_VSC 0x0020 /* Apple Macintosh Duo MiniDock */
#define NUBUS_DRHW_JET 0x0029 /* Apple Macintosh DuoDock II */
#define NUBUS_DRHW_BOOGIE 0x002b /* Apple Macintosh 24AC Video Card */
#define NUBUS_DRHW_SUPRGFX 0x0105 /* SuperMac GFX */
#define NUBUS_DRHW_FORMAC 0x013A /* Formac color card II */
@ -115,8 +121,11 @@
#define NUBUS_CATEGORY_COMMUNICATIONS 0x0006
#define NUBUS_TYPE_RS232 0x0002
#define NUBUS_TYPE_IEEE488 0x0004
#define NUBUS_DRSW_HDS 0x0102
#define NUBUS_DRHW_HDS 0x0102
#define NUBUS_DRSW_NI488 0x0104
#define NUBUS_DRHW_HDS 0x0102 /* Creative Solutions Hustler serial */
#define NUBUS_DRHW_NB_GPIB_TNT 0x0102 /* NatInst NB-GPIB/TNT */
#define NUBUS_CATEGORY_MEMORY 0x0009 /* Also KanjiTalk Font Card? */
#define NUBUS_TYPE_RAMCACHE 0x010C /* From Apple PDS card */
@ -135,9 +144,28 @@
#define NUBUS_DRHW_AWGSPDS_SCSI 0x0100
#define NUBUS_DRSW_PLI 0x0108
#define NUBUS_DRHW_PLI 0x0100
#define NUBUS_DRSW_FWB 0x010C
#define NUBUS_TYPE_SCSIW 0x000B /* FWB JackHammer Fast/Wide */
#define NUBUS_DRSW_FWB 0x0001 /* XXX Allen says 0x010C */
#define NUBUS_DRHW_FWB 0x0100
#define NUBUS_CATEGORY_DOCK 0x0020
#define NUBUS_TYPE_STATION 0x0001
#define NUBUS_TYPE_DESK 0x0002
#define NUBUS_TYPE_TRAVEL 0x0003
/* #define NUBUS_DRSW_APPLE 0x0001 */
#define NUBUS_DRSW_NEWERTECH 0x0101
/* Station */
#define NUBUS_DRHW_DUODOCK 0x0001 /* Apple DuoDock */
#define NUBUS_DRHW_DUODOCKII 0x0002 /* Apple DuoDock II */
/* Desk */
#define NUBUS_DRHW_DUOMINIDOCK 0x0001 /* Apple Duo MiniDock */
/* Travel */
#define NUBUS_DRHW_MICROSCSI 0x0100 /* Newer Technology SCSI MicroDock */
/*
* This is the same as Apple's Format Block for a card, with the
* addition of a pointer to the base of the NuBUS slot.
@ -210,6 +238,29 @@ typedef struct _nubus_rsrc {
u_int32_t data;
} nubus_rsrc;
/*
* On a NuBus master, an sMemory resource (this is a second-level
* resource list) holds a list of address ranges for onboard
* RAM, ROM and IO resources.
*/
typedef struct _nubus_smem_range {
u_int32_t length;
u_int32_t offset;
} nubus_smem_range;
/*
* XXX This is mapped on the range list we get back out of the sMemory
* resources. I would have liked the range[] array to be of undefined
* size but the compiler does not let me.
* Maybe it's just too much grief, and we should work with an array
* of u_int32_t.
*/
typedef struct _nubus_smem_rangelist {
u_int32_t length;
nubus_smem_range range[1];
} nubus_smem_rangelist;
/* Resource IDs for NUBUS_CATEGORY_* (All) */
#define NUBUS_RSRC_TYPE 0x01 /* Type (required) */
#define NUBUS_RSRC_NAME 0x02 /* Name (required) */
@ -226,6 +277,7 @@ typedef struct _nubus_rsrc {
#define NUBUS_RSRC_CICN 0x0F /* Color icon */
#define NUBUS_RSRC_ICL8 0x10 /* 8-bit icon data */
#define NUBUS_RSRC_ICL4 0x11 /* 4-bit icon data */
#define NUBUS_RSRC_SMEMORY 0x6C /* Resource list for master */
/* Resource IDs for NUBUS_CATEGORY_DISPLAY */
#define NUBUS_RSRC_GAMMADIR 0x40 /* ID for gamma directory */
@ -252,6 +304,15 @@ typedef struct _nubus_rsrc {
#define NUBUS_RSRC_VEND_PART 0x04 /* Card part number */
#define NUBUS_RSRC_VEND_DATE 0x05 /* Card revision date */
/* Resource IDs for NUBUS_RSRC_SMEMORY master sMemory resource list */
#define NUBUS_RSRC_SMEM_MINOR_RAMADDR 0x80 /* Minor RAM address ranges */
#define NUBUS_RSRC_SMEM_MAJOR_RAMADDR 0x81 /* Major RAM address ranges */
#define NUBUS_RSRC_SMEM_MINOR_ROMADDR 0x82 /* Minor ROM address ranges */
#define NUBUS_RSRC_SMEM_MAJOR_ROMADDR 0x83 /* Major ROM address ranges */
#define NUBUS_RSRC_SMEM_MINOR_DEVADDR 0x84 /* Minor device address ranges */
#define NUBUS_RSRC_SMEM_MAJOR_DEVADDR 0x85 /* Major device address ranges */
typedef struct _NUBUS_DRIVER {
u_int8_t drvr_id;
u_int32_t offset;
@ -298,6 +359,7 @@ struct nubus_softc {
struct device sc_dev;
};
void nubus_get_main_dir __P((nubus_slot *slot, nubus_dir *dir_return));
void nubus_get_dir_from_rsrc __P((nubus_slot *slot, nubus_dirent *dirent,
nubus_dir *dir_return));
@ -311,6 +373,8 @@ int nubus_get_ind_data __P((bus_space_tag_t, bus_space_handle_t,
int nubus_get_c_string __P((bus_space_tag_t, bus_space_handle_t,
nubus_slot *slot, nubus_dirent *dirent,
caddr_t data_return, int max_bytes));
int nubus_get_smem_addr_rangelist __P((bus_space_tag_t, bus_space_handle_t,
nubus_slot *fmt, nubus_dirent *dirent, caddr_t data_return));
char *nubus_get_vendor __P((bus_space_tag_t, bus_space_handle_t,
nubus_slot *slot, int rsrc));