/*
JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine
Release Version 2.4
A project from the Physics Dept, The University of Oxford
Copyright (C) 2007-2010 The University of Oxford
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Details (including contact information) can be found at:
jpc.sourceforge.net
or the developer website
sourceforge.net/projects/jpc/
Conceived and Developed by:
Rhys Newman, Ian Preston, Chris Dennis
End of licence header
*/
package org.jpc.emulator.pci;
/**
* A <code>PCIDevice</code> object can be registered with a <code>PCIBus</code>
* object which will configure it and organise the allocation of its resources.
* @author Chris Dennis
*/
public interface PCIDevice
{
public static final int PCI_ROM_SLOT = 6;
public static final int PCI_NUM_REGIONS = 7;
public static final int PCI_CONFIG_VENDOR_ID = 0x00;
public static final int PCI_CONFIG_DEVICE_ID = 0x02;
public static final int PCI_CONFIG_COMMAND = 0x04;
public static final int PCI_CONFIG_STATUS = 0x06;
public static final int PCI_CONFIG_REVISION = 0x08;
public static final int PCI_CONFIG_CLASS_DEVICE = 0x0a;
public static final int PCI_CONFIG_CLS = 0x0c;
public static final int PCI_CONFIG_LATENCY = 0x0d;
public static final int PCI_CONFIG_HEADER = 0x0e;
public static final int PCI_CONFIG_BIST = 0x0f;
public static final int PCI_CONFIG_BASE_ADDRESS = 0x10;
public static final int PCI_CONFIG_EXPANSION_ROM_BASE_ADDRESS = 0x30;
public static final int PCI_CONFIG_INTERRUPT_LINE = 0x3c;
public static final int PCI_CONFIG_INTERRUPT_PIN = 0x3d;
public static final int PCI_CONFIG_MIN_GNT = 0x3e;
public static final int PCI_CONFIG_MAX_LATENCY = 0x3f;
public static final int PCI_COMMAND_IO = 0x1;
public static final int PCI_COMMAND_MEMORY = 0x2;
public static final int PCI_HEADER_PCI_PCI_BRIDGE = 0x01;
public static final int PCI_HEADER_SINGLE_FUNCTION = 0x00;
public static final int PCI_HEADER_MULTI_FUNCTION = 0x80;
//PCI Bus Registering
/**
* Returns this devices device/function number.
* @return device/function number.
*/
public int getDeviceFunctionNumber();
/**
* Returns <code>true</code> if this device's device/function number can be
* chosen for it.
* <p>
* Some high-level devices (for example the PCI bridges) may have statically
* assigned device numbers, they will return <code>false</code> here to
* prevent the bus from choosing a value for them.
* @return <code>true</code> if this devices number can be assigned by the PCI bus.
*/
public boolean autoAssignDeviceFunctionNumber();
/**
* Attempt to assign this device's device/function number.
* <p>
* Currently this may silently fail, decision must be made as to behaviour
* if this is called on say the host bridge.
* @param number new device/function number.
*/
public void assignDeviceFunctionNumber(int number);
/**
* Deassign this devices device/function number.
* <p>
* Currently this happens when a PCI device is removed. That can only happen
* if a new device specifically requests the same device/function number.
*/
public void deassignDeviceFunctionNumber();
/**
* Writes a byte into this PCI devices configuration space.
* <p>
* The method should return <code>true</code> if this devices configuration
* has changed such that it's resource mappings need updating.
* <p>
* Attempts to write into read-only or reserved locations in the
* configuration space of this device using this method should silently
* fail.
* @param address offset to write to.
* @param data byte value to be written.
* @return <code>true</code> if the device needs remapping.
*/
public boolean configWriteByte(int address, byte data);
/**
* Writes a word in little-endian format into this PCI devices configuration
* space.
* <p>
* The method should return <code>true</code> if this devices configuration
* has changed such that it's resource mappings need updating.
* <p>
* Attempts to write into read-only or reserved locations in the
* configuration space of this device using this method should silently
* fail.
* @param address offset of the first byte to be written.
* @param data short value to be written.
* @return <code>true</code> if this device needs remapping.
*/
public boolean configWriteWord(int address, short data);
/**
* Writes a long in little-endian format into this PCI devices configuration
* space.
* <p>
* The method should return <code>true</code> if this devices configuration
* has changed such that it's resource mappings need updating.
* <p>
* Attempts to write into read-only or reserved locations in the
* configuration space of this device using this method should silently
* fail.
* @param address offset of the first byte to be written.
* @param data int value to be written.
* @return <code>true</code> if this device needs remapping.
*/
public boolean configWriteLong(int address, int data);
/**
* Reads a byte from this PCI devices configuration space.
* @param address offset to read from.
* @return byte value read.
*/
public byte configReadByte(int address);
/**
* Reads a little-endian word from this PCI devices configuration space.
* @param address offset of the first byte to be read.
* @return short value read.
*/
public short configReadWord(int address);
/**
* Reads a little-endian long from this PCI devices configuration space.
* @param address offset of the first byte to be read.
* @return int value read.
*/
public int configReadLong(int address);
/**
* Forces the writes of a byte into this PCI devices configuration space.
* <p>
* This method writes directly into this PCI device's configuration space
* with no regard for read-only or reserved locations.
* @param address offset to write to.
* @param data byte value to be written.
*/
public void putConfigByte(int address, byte data);
/**
* Forces the writes of a little-endian word into this PCI device's
* configuration space.
* <p>
* This method writes directly into this PCI device's configuration space
* with no regard for read-only or reserved locations.
* @param address offset of the first byte to be written.
* @param data short value to be written.
*/
public void putConfigWord(int address, short data);
/**
* Forces the writes of a little-endian long into this PCI device's
* configuration space.
* <p>
* This method writes directly into this PCI device's configuration space
* with no regard for read-only or reserved locations.
* @param address offset of the first byte to be written.
* @param data int value to be written.
*/
public void putConfigLong(int address, int data);
/**
* Returns a list of all of this PCI devices configurable <code>IORegions</code>
* <p>
* Note that the number of an <code>IORegion</code> in the returned array is
* not the same as the <code>IORegion</code>'s region number.
* @return device's set of <code>IORegions</code>
*/
public IORegion[] getIORegions();
/**
* Returns the <code>IORegion</code> with region number <code>number</code>
* <p>
* If a device has not region at that number then it will return <code>null</code>
* <p>
* Note that devices do not have to have a contiguous set of regions. Just
* because region <code>n</code> is <code>null</code> does not mean
* that <code>n+1</code> will be also.
* @param number <code>IORegion</code> number.
* @return <code>IORegion</code> with number <code>number</code>.
*/
public IORegion getIORegion(int number);
public void setIRQIndex(int irqIndex);
public int getIRQIndex();
public void addIRQBouncer(IRQBouncer bouncer);
public IRQBouncer getIRQBouncer();
}