* Copyright 2006, Marcus Overhagen. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "pci.h"
#include "pci_private.h"
#include "arch_cpu.h"
#undef TRACE
#ifdef TRACE_PCI_IO
# define TRACE(x...) dprintf("PCI_IO: " x)
#else
# define TRACE(x...) ;
#endif
#if defined(__i386__) || defined(__x86_64__)
uint8
pci_read_io_8(int mapped_io_addr)
{
return in8(mapped_io_addr);
}
void
pci_write_io_8(int mapped_io_addr, uint8 value)
{
out8(value, mapped_io_addr);
}
uint16
pci_read_io_16(int mapped_io_addr)
{
return in16(mapped_io_addr);
}
void
pci_write_io_16(int mapped_io_addr, uint16 value)
{
out16(value, mapped_io_addr);
}
uint32
pci_read_io_32(int mapped_io_addr)
{
return in32(mapped_io_addr);
}
void
pci_write_io_32(int mapped_io_addr, uint32 value)
{
out32(value, mapped_io_addr);
}
#else
static uint8*
get_io_port_address(int ioPort)
{
uint8 domain;
pci_resource_range range;
uint8 *mappedAdr;
if (gPCI->LookupRange(B_IO_PORT, ioPort, domain, range, &mappedAdr) < B_OK)
return NULL;
return mappedAdr + ioPort;
}
uint8
pci_read_io_8(int mapped_io_addr)
{
TRACE("pci_read_io_8(%d)\n", mapped_io_addr);
vuint8* ptr = get_io_port_address(mapped_io_addr);
if (ptr == NULL)
return 0;
return *ptr;
}
void
pci_write_io_8(int mapped_io_addr, uint8 value)
{
TRACE("pci_write_io_8(%d)\n", mapped_io_addr);
vuint8* ptr = get_io_port_address(mapped_io_addr);
if (ptr == NULL)
return;
*ptr = value;
}
uint16
pci_read_io_16(int mapped_io_addr)
{
TRACE("pci_read_io_16(%d)\n", mapped_io_addr);
vuint16* ptr = (uint16*)get_io_port_address(mapped_io_addr);
if (ptr == NULL)
return 0;
return *ptr;
}
void
pci_write_io_16(int mapped_io_addr, uint16 value)
{
TRACE("pci_write_io_16(%d)\n", mapped_io_addr);
vuint16* ptr = (uint16*)get_io_port_address(mapped_io_addr);
if (ptr == NULL)
return;
*ptr = value;
}
uint32
pci_read_io_32(int mapped_io_addr)
{
TRACE("pci_read_io_32(%d)\n", mapped_io_addr);
vuint32* ptr = (uint32*)get_io_port_address(mapped_io_addr);
if (ptr == NULL)
return 0;
return *ptr;
}
void
pci_write_io_32(int mapped_io_addr, uint32 value)
{
TRACE("pci_write_io_32(%d)\n", mapped_io_addr);
vuint32* ptr = (vuint32*)get_io_port_address(mapped_io_addr);
if (ptr == NULL)
return;
*ptr = value;
}
#endif