nubus: Generalize block resource handling

Scrap the specialized code to unpack video mode name resources and
driver resources. It isn't useful.
Instead, add a re-usable function to handle lists of block resources of
any kind, and descend into the video mode table resource directory.
Rename callers as nubus_get_foo(), consistent with their purpose and
with related functions in the same file.

Tested-by: Stan Johnson <userm57@yahoo.com>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
Finn Thain 2018-01-13 17:37:13 -05:00 коммит произвёл Geert Uytterhoeven
Родитель 4bccc4b629
Коммит 883b8cb31a
1 изменённых файлов: 65 добавлений и 58 удалений

Просмотреть файл

@ -331,16 +331,63 @@ EXPORT_SYMBOL(nubus_find_rsrc);
among other things. The rest of it should go in the /proc code.
For now, we just use it to give verbose boot logs. */
static int __init nubus_show_display_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
static int __init nubus_get_block_rsrc_dir(struct nubus_board *board,
const struct nubus_dirent *parent)
{
struct nubus_dir dir;
struct nubus_dirent ent;
nubus_get_subdir(parent, &dir);
while (nubus_readdir(&dir, &ent) != -1) {
u32 size;
nubus_get_rsrc_mem(&size, &ent, 4);
pr_debug(" block (0x%x), size %d\n", ent.type, size);
}
return 0;
}
static int __init nubus_get_display_vidmode(struct nubus_board *board,
const struct nubus_dirent *parent)
{
struct nubus_dir dir;
struct nubus_dirent ent;
nubus_get_subdir(parent, &dir);
while (nubus_readdir(&dir, &ent) != -1) {
switch (ent.type) {
case 1: /* mVidParams */
case 2: /* mTable */
{
u32 size;
nubus_get_rsrc_mem(&size, &ent, 4);
pr_debug(" block (0x%x), size %d\n", ent.type,
size);
break;
}
default:
pr_debug(" unknown resource 0x%02x, data 0x%06x\n",
ent.type, ent.data);
}
}
return 0;
}
static int __init nubus_get_display_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
{
switch (ent->type) {
case NUBUS_RESID_GAMMADIR:
pr_debug(" gamma directory offset: 0x%06x\n", ent->data);
nubus_get_block_rsrc_dir(dev->board, ent);
break;
case 0x0080 ... 0x0085:
pr_debug(" mode 0x%02x info offset: 0x%06x\n",
ent->type, ent->data);
nubus_get_display_vidmode(dev->board, ent);
break;
default:
pr_debug(" unknown resource 0x%02x, data 0x%06x\n",
@ -349,8 +396,8 @@ static int __init nubus_show_display_resource(struct nubus_dev *dev,
return 0;
}
static int __init nubus_show_network_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
static int __init nubus_get_network_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
{
switch (ent->type) {
case NUBUS_RESID_MAC_ADDRESS:
@ -368,8 +415,8 @@ static int __init nubus_show_network_resource(struct nubus_dev *dev,
return 0;
}
static int __init nubus_show_cpu_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
static int __init nubus_get_cpu_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
{
switch (ent->type) {
case NUBUS_RESID_MEMINFO:
@ -397,18 +444,18 @@ static int __init nubus_show_cpu_resource(struct nubus_dev *dev,
return 0;
}
static int __init nubus_show_private_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
static int __init nubus_get_private_resource(struct nubus_dev *dev,
const struct nubus_dirent *ent)
{
switch (dev->category) {
case NUBUS_CAT_DISPLAY:
nubus_show_display_resource(dev, ent);
nubus_get_display_resource(dev, ent);
break;
case NUBUS_CAT_NETWORK:
nubus_show_network_resource(dev, ent);
nubus_get_network_resource(dev, ent);
break;
case NUBUS_CAT_CPU:
nubus_show_cpu_resource(dev, ent);
nubus_get_cpu_resource(dev, ent);
break;
default:
pr_debug(" unknown resource 0x%02x, data 0x%06x\n",
@ -462,14 +509,9 @@ nubus_get_functional_resource(struct nubus_board *board, int slot,
{
/* MacOS driver. If we were NetBSD we might
use this :-) */
struct nubus_dir drvr_dir;
struct nubus_dirent drvr_ent;
unsigned char *driver;
nubus_get_subdir(&ent, &drvr_dir);
nubus_readdir(&drvr_dir, &drvr_ent);
driver = nubus_dirptr(&drvr_ent);
pr_debug(" driver at: 0x%p\n", driver);
pr_debug(" driver directory offset: 0x%06x\n",
ent.data);
nubus_get_block_rsrc_dir(board, &ent);
break;
}
case NUBUS_RESID_MINOR_BASEOS:
@ -501,50 +543,13 @@ nubus_get_functional_resource(struct nubus_board *board, int slot,
default:
/* Local/Private resources have their own
function */
nubus_show_private_resource(dev, &ent);
nubus_get_private_resource(dev, &ent);
}
}
return dev;
}
/* This is cool. */
static int __init nubus_get_vidnames(struct nubus_board *board,
const struct nubus_dirent *parent)
{
struct nubus_dir dir;
struct nubus_dirent ent;
/* FIXME: obviously we want to put this in a header file soon */
struct vidmode {
u32 size;
/* Don't know what this is yet */
u16 id;
/* Longest one I've seen so far is 26 characters */
char name[36];
};
pr_debug(" video modes supported:\n");
nubus_get_subdir(parent, &dir);
while (nubus_readdir(&dir, &ent) != -1) {
struct vidmode mode;
u32 size;
/* First get the length */
nubus_get_rsrc_mem(&size, &ent, 4);
/* Now clobber the whole thing */
if (size > sizeof(mode) - 1)
size = sizeof(mode) - 1;
memset(&mode, 0, sizeof(mode));
nubus_get_rsrc_mem(&mode, &ent, size);
pr_debug(" 0x%02x: 0x%04x %s\n", ent.type,
mode.id, mode.name);
}
return 0;
}
/* This is *really* cool. */
static int __init nubus_get_icon(struct nubus_board *board,
const struct nubus_dirent *ent)
@ -641,7 +646,9 @@ static int __init nubus_get_board_resource(struct nubus_board *board, int slot,
break;
/* WTF isn't this in the functional resources? */
case NUBUS_RESID_VIDNAMES:
nubus_get_vidnames(board, &ent);
pr_debug(" vidnames directory offset: 0x%06x\n",
ent.data);
nubus_get_block_rsrc_dir(board, &ent);
break;
/* Same goes for this */
case NUBUS_RESID_VIDMODES: