Added ISA bus manager written by Thomas Kurschel. This is currently
hard coded to use the ISA IDE driver only. This bus manager is architecture dependent; maybe there is a better place to live for it than here. x86 and PPC/Pegasos will have an ISA bus later - this module only supports x86 for now. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7777 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
SubDir OBOS_TOP src add-ons kernel bus_managers isa ;
|
||||||
|
|
||||||
|
UsePrivateHeaders kernel ;
|
||||||
|
|
||||||
|
KernelAddon isa : kernel bus_managers :
|
||||||
|
isa.c
|
||||||
|
;
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef _I386_IO_H
|
||||||
|
#define _I386_IO_H
|
||||||
|
|
||||||
|
#define out8(value,port) \
|
||||||
|
__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))
|
||||||
|
|
||||||
|
#define out16(value,port) \
|
||||||
|
__asm__ ("outw %%ax,%%dx"::"a" (value),"d" (port))
|
||||||
|
|
||||||
|
#define out32(value,port) \
|
||||||
|
__asm__ ("outl %%eax,%%dx"::"a" (value),"d" (port))
|
||||||
|
|
||||||
|
#define in8(port) ({ \
|
||||||
|
unsigned char _v; \
|
||||||
|
__asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
|
||||||
|
_v; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define in16(port) ({ \
|
||||||
|
unsigned short _v; \
|
||||||
|
__asm__ volatile ("inw %%dx,%%ax":"=a" (_v):"d" (port)); \
|
||||||
|
_v; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define in32(port) ({ \
|
||||||
|
unsigned int _v; \
|
||||||
|
__asm__ volatile ("inl %%dx,%%eax":"=a" (_v):"d" (port)); \
|
||||||
|
_v; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
/*
|
||||||
|
** Copyright 2002/03, Thomas Kurschel. All rights reserved.
|
||||||
|
** Distributed under the terms of the OpenBeOS License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
ISA bus manager
|
||||||
|
|
||||||
|
Implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <bus/ISA.h>
|
||||||
|
#include <KernelExport.h>
|
||||||
|
#include <device_manager.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
//#define TRACE_ISA
|
||||||
|
#ifdef TRACE_ISA
|
||||||
|
# define TRACE(x) dprintf x
|
||||||
|
#else
|
||||||
|
# define TRACE(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ToDo: this is architecture dependent and should be made differently!
|
||||||
|
#include "i386_io.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define ISA_MODULE_NAME "bus_managers/isa/root"
|
||||||
|
|
||||||
|
device_manager_info *pnp;
|
||||||
|
|
||||||
|
|
||||||
|
static uint8
|
||||||
|
isa_read_io_8(int mapped_io_addr)
|
||||||
|
{
|
||||||
|
uint8 value = in8(mapped_io_addr);
|
||||||
|
|
||||||
|
TRACE(("isa_read8(%x->%x)\n", mapped_io_addr, value));
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
isa_write_io_8(int mapped_io_addr, uint8 value)
|
||||||
|
{
|
||||||
|
TRACE(("isa_write8(%x->%x)\n", value, mapped_io_addr));
|
||||||
|
|
||||||
|
out8(value, mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static uint16
|
||||||
|
isa_read_io_16(int mapped_io_addr)
|
||||||
|
{
|
||||||
|
return in16(mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
isa_write_io_16(int mapped_io_addr, uint16 value)
|
||||||
|
{
|
||||||
|
out16(value, mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static uint32
|
||||||
|
isa_read_io_32(int mapped_io_addr)
|
||||||
|
{
|
||||||
|
return in32(mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
isa_write_io_32(int mapped_io_addr, uint32 value)
|
||||||
|
{
|
||||||
|
out32(value, mapped_io_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ram_address(const void *physical_address_in_system_memory)
|
||||||
|
{
|
||||||
|
// this is what the BeOS kernel does
|
||||||
|
return (void *)physical_address_in_system_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
start_isa_dma(long channel, void *buf, long transfer_count,
|
||||||
|
uchar mode, uchar e_mode)
|
||||||
|
{
|
||||||
|
// TBD
|
||||||
|
// ToDo
|
||||||
|
return B_NOT_ALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static status_t
|
||||||
|
lock_isa_dma_channel(long channel)
|
||||||
|
{
|
||||||
|
// TBD
|
||||||
|
// ToDo
|
||||||
|
return B_NOT_ALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
unlock_isa_dma_channel(long channel)
|
||||||
|
{
|
||||||
|
// TBD
|
||||||
|
// ToDo
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
isa_init_device(pnp_node_handle node, void *user_cookie, void **cookie)
|
||||||
|
{
|
||||||
|
*cookie = NULL;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
isa_uninit_device(void *cookie)
|
||||||
|
{
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
isa_device_added(pnp_node_handle parent)
|
||||||
|
{
|
||||||
|
static const pnp_node_attr attrs[] = {
|
||||||
|
// info about ourself
|
||||||
|
{ PNP_DRIVER_DRIVER, B_STRING_TYPE, { string: ISA_MODULE_NAME }},
|
||||||
|
{ PNP_DRIVER_TYPE, B_STRING_TYPE, { string: ISA_DEVICE_TYPE_NAME }},
|
||||||
|
// unique connection
|
||||||
|
{ PNP_DRIVER_CONNECTION, B_STRING_TYPE, { string: "ISA" }},
|
||||||
|
|
||||||
|
// mark as being a bus
|
||||||
|
{ PNP_BUS_IS_BUS, B_UINT8_TYPE, { ui8: 1 }},
|
||||||
|
|
||||||
|
// tell where to look for consumers
|
||||||
|
// ToDo: temporary hack to get things started!
|
||||||
|
{ PNP_DRIVER_FIXED_CONSUMER, B_STRING_TYPE, { string: "busses/ide/ide_isa/isa/device/v1" }},
|
||||||
|
{ PNP_DRIVER_DYNAMIC_CONSUMER, B_STRING_TYPE, { string: ISA_DRIVERS_DIR "/" }},
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
pnp_node_handle node;
|
||||||
|
char *parent_type;
|
||||||
|
status_t res;
|
||||||
|
|
||||||
|
// make sure parent is really pnp root
|
||||||
|
if (pnp->get_attr_string( parent, PNP_DRIVER_TYPE, &parent_type, false))
|
||||||
|
return B_ERROR;
|
||||||
|
|
||||||
|
if (strcmp(parent_type, "pnp/root")) {
|
||||||
|
free(parent_type);
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(parent_type);
|
||||||
|
|
||||||
|
res = pnp->register_device(parent, attrs, NULL, &node);
|
||||||
|
if (res != B_OK)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
std_ops(int32 op, ...)
|
||||||
|
{
|
||||||
|
switch (op) {
|
||||||
|
case B_MODULE_INIT:
|
||||||
|
case B_MODULE_UNINIT:
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module_dependency module_dependencies[] = {
|
||||||
|
{ DEVICE_MANAGER_MODULE_NAME, (module_info **)&pnp },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
isa2_module_info isa_interface = {
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{
|
||||||
|
ISA_MODULE_NAME,
|
||||||
|
0,
|
||||||
|
std_ops
|
||||||
|
},
|
||||||
|
|
||||||
|
isa_init_device,
|
||||||
|
isa_uninit_device,
|
||||||
|
isa_device_added,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
|
||||||
|
// this rescan(); as ISA relies on device drivers to detect their
|
||||||
|
// devices themselves, we don't have an universal rescan method
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
|
||||||
|
isa_read_io_8, isa_write_io_8,
|
||||||
|
isa_read_io_16, isa_write_io_16,
|
||||||
|
isa_read_io_32, isa_write_io_32,
|
||||||
|
|
||||||
|
ram_address,
|
||||||
|
|
||||||
|
start_isa_dma,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if !_BUILDING_kernel && !BOOT
|
||||||
|
_EXPORT
|
||||||
|
module_info *modules[] = {
|
||||||
|
(module_info *)&isa_interface,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user