Many changes for cardbus support, automatic detection of PCI bridges,
resource allocation, and tracking.
This commit is contained in:
		
							parent
							
								
									ac7f7f3022
								
							
						
					
					
						commit
						e44aaf4c37
					
				@ -6,6 +6,16 @@ main.c
 | 
			
		||||
 | 
			
		||||
#include <ibm/pci.h>
 | 
			
		||||
 | 
			
		||||
#include "pci.h"
 | 
			
		||||
 | 
			
		||||
#define NR_DRIVERS	16
 | 
			
		||||
 | 
			
		||||
PRIVATE struct name
 | 
			
		||||
{
 | 
			
		||||
	char name[M3_STRING];
 | 
			
		||||
	int tasknr;
 | 
			
		||||
} names[NR_DRIVERS];
 | 
			
		||||
 | 
			
		||||
FORWARD _PROTOTYPE( void do_init, (message *mp)				);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_first_dev, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_next_dev, (message *mp)			);
 | 
			
		||||
@ -15,18 +25,23 @@ FORWARD _PROTOTYPE( void do_dev_name, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_slot_name, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_reserve, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_attr_r8, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_attr_r16, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_attr_r32, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_attr_w8, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_attr_w16, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_attr_w32, (message *mp)			);
 | 
			
		||||
FORWARD _PROTOTYPE( void do_rescan_bus, (message *mp)			);
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
	int r;
 | 
			
		||||
	int i, r;
 | 
			
		||||
	message m;
 | 
			
		||||
 | 
			
		||||
	printf("PCI says: hello world\n");
 | 
			
		||||
 | 
			
		||||
	pci_init();
 | 
			
		||||
 | 
			
		||||
	for (i= 0; i<NR_DRIVERS; i++)
 | 
			
		||||
		names[i].tasknr= ANY;
 | 
			
		||||
 | 
			
		||||
	for(;;)
 | 
			
		||||
	{
 | 
			
		||||
		r= receive(ANY, &m);
 | 
			
		||||
@ -46,10 +61,14 @@ int main(void)
 | 
			
		||||
		case BUSC_PCI_SLOT_NAME: do_slot_name(&m); break;
 | 
			
		||||
		case BUSC_PCI_RESERVE: do_reserve(&m); break;
 | 
			
		||||
		case BUSC_PCI_ATTR_R8: do_attr_r8(&m); break;
 | 
			
		||||
		case BUSC_PCI_ATTR_R16: do_attr_r16(&m); break;
 | 
			
		||||
		case BUSC_PCI_ATTR_R32: do_attr_r32(&m); break;
 | 
			
		||||
		case BUSC_PCI_ATTR_W8: do_attr_w8(&m); break;
 | 
			
		||||
		case BUSC_PCI_ATTR_W16: do_attr_w16(&m); break;
 | 
			
		||||
		case BUSC_PCI_ATTR_W32: do_attr_w32(&m); break;
 | 
			
		||||
		case BUSC_PCI_RESCAN: do_rescan_bus(&m); break;
 | 
			
		||||
		default:
 | 
			
		||||
			printf("got message from %d, type %d\n",
 | 
			
		||||
			printf("PCI: got message from %d, type %d\n",
 | 
			
		||||
				m.m_source, m.m_type);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
@ -61,9 +80,25 @@ int main(void)
 | 
			
		||||
PRIVATE void do_init(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
	int r;
 | 
			
		||||
	int i, r, empty;
 | 
			
		||||
 | 
			
		||||
	/* NOP for the moment */
 | 
			
		||||
	printf("pci_init: called by '%s'\n", mp->m3_ca1);
 | 
			
		||||
	empty= -1;
 | 
			
		||||
	for (i= 0; i<NR_DRIVERS; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (empty == -1 && names[i].tasknr == ANY)
 | 
			
		||||
			empty= i;
 | 
			
		||||
		if (strcmp(names[i].name, mp->m3_ca1) == 0)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	if (i < NR_DRIVERS)
 | 
			
		||||
		pci_release(names[i].name);
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		i= empty;
 | 
			
		||||
		strcpy(names[i].name, mp->m3_ca1);
 | 
			
		||||
	}
 | 
			
		||||
	names[i].tasknr= mp->m_source;
 | 
			
		||||
 | 
			
		||||
	mp->m_type= 0;
 | 
			
		||||
	r= send(mp->m_source, mp);
 | 
			
		||||
@ -225,11 +260,24 @@ message *mp;
 | 
			
		||||
PRIVATE void do_reserve(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
	int r, devind;
 | 
			
		||||
	int i, r, devind;
 | 
			
		||||
 | 
			
		||||
	/* Find the name of the caller */
 | 
			
		||||
	for (i= 0; i<NR_DRIVERS; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (names[i].tasknr == mp->m_source)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	if (i >= NR_DRIVERS)
 | 
			
		||||
	{
 | 
			
		||||
		printf("pci`do_reserve: task %d did not call pci_init\n",
 | 
			
		||||
			mp->m_source);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	devind= mp->m1_i1;
 | 
			
		||||
 | 
			
		||||
	pci_reserve(devind);
 | 
			
		||||
	pci_reserve2(devind, names[i].name);
 | 
			
		||||
	mp->m_type= OK;
 | 
			
		||||
	r= send(mp->m_source, mp);
 | 
			
		||||
	if (r != 0)
 | 
			
		||||
@ -259,6 +307,26 @@ message *mp;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PRIVATE void do_attr_r16(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
	int r, devind, port;
 | 
			
		||||
	u32_t v;
 | 
			
		||||
 | 
			
		||||
	devind= mp->m2_i1;
 | 
			
		||||
	port= mp->m2_i2;
 | 
			
		||||
 | 
			
		||||
	v= pci_attr_r16(devind, port);
 | 
			
		||||
	mp->m2_l1= v;
 | 
			
		||||
	mp->m_type= OK;
 | 
			
		||||
	r= send(mp->m_source, mp);
 | 
			
		||||
	if (r != 0)
 | 
			
		||||
	{
 | 
			
		||||
		printf("do_attr_r16: unable to send to %d: %d\n",
 | 
			
		||||
			mp->m_source, r);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PRIVATE void do_attr_r32(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
@ -279,6 +347,46 @@ message *mp;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PRIVATE void do_attr_w8(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
	int r, devind, port;
 | 
			
		||||
	u8_t v;
 | 
			
		||||
 | 
			
		||||
	devind= mp->m2_i1;
 | 
			
		||||
	port= mp->m2_i2;
 | 
			
		||||
	v= mp->m2_l1;
 | 
			
		||||
 | 
			
		||||
	pci_attr_w8(devind, port, v);
 | 
			
		||||
	mp->m_type= OK;
 | 
			
		||||
	r= send(mp->m_source, mp);
 | 
			
		||||
	if (r != 0)
 | 
			
		||||
	{
 | 
			
		||||
		printf("do_attr_w8: unable to send to %d: %d\n",
 | 
			
		||||
			mp->m_source, r);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PRIVATE void do_attr_w16(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
	int r, devind, port;
 | 
			
		||||
	u16_t v;
 | 
			
		||||
 | 
			
		||||
	devind= mp->m2_i1;
 | 
			
		||||
	port= mp->m2_i2;
 | 
			
		||||
	v= mp->m2_l1;
 | 
			
		||||
 | 
			
		||||
	pci_attr_w16(devind, port, v);
 | 
			
		||||
	mp->m_type= OK;
 | 
			
		||||
	r= send(mp->m_source, mp);
 | 
			
		||||
	if (r != 0)
 | 
			
		||||
	{
 | 
			
		||||
		printf("do_attr_w16: unable to send to %d: %d\n",
 | 
			
		||||
			mp->m_source, r);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PRIVATE void do_attr_w32(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
@ -299,3 +407,20 @@ message *mp;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PRIVATE void do_rescan_bus(mp)
 | 
			
		||||
message *mp;
 | 
			
		||||
{
 | 
			
		||||
	int r, busnr;
 | 
			
		||||
 | 
			
		||||
	busnr= mp->m2_i1;
 | 
			
		||||
 | 
			
		||||
	pci_rescan_bus(busnr);
 | 
			
		||||
	mp->m_type= OK;
 | 
			
		||||
	r= send(mp->m_source, mp);
 | 
			
		||||
	if (r != 0)
 | 
			
		||||
	{
 | 
			
		||||
		printf("do_rescan_bus: unable to send to %d: %d\n",
 | 
			
		||||
			mp->m_source, r);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -13,39 +13,6 @@ _PROTOTYPE( void pci_outb, (U16_t port, U8_t value) );
 | 
			
		||||
_PROTOTYPE( void pci_outw, (U16_t port, U16_t value) );
 | 
			
		||||
_PROTOTYPE( void pci_outl, (U16_t port, U32_t value) );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define PCI_VID		0x00	/* Vendor ID, 16-bit */
 | 
			
		||||
#define PCI_DID		0x02	/* Device ID, 16-bit */
 | 
			
		||||
#define PCI_CR		0x04	/* Command Register, 16-bit */
 | 
			
		||||
#define PCI_PCISTS	0x06	/* PCI status, 16-bit */
 | 
			
		||||
#define		 PSR_SSE	0x4000	/* Signaled System Error */
 | 
			
		||||
#define		 PSR_RMAS	0x2000	/* Received Master Abort Status */
 | 
			
		||||
#define		 PSR_RTAS	0x1000	/* Received Target Abort Status */
 | 
			
		||||
#define PCI_REV		0x08	/* Revision ID */
 | 
			
		||||
#define PCI_PIFR	0x09	/* Prog. Interface Register */
 | 
			
		||||
#define PCI_SCR		0x0A	/* Sub-Class Register */
 | 
			
		||||
#define PCI_BCR		0x0B	/* Base-Class Register */
 | 
			
		||||
#define PCI_HEADT	0x0E	/* Header type, 8-bit */
 | 
			
		||||
#define		PHT_MULTIFUNC	0x80	/* Multiple functions */
 | 
			
		||||
#define PCI_BAR		0x10	/* Base Address Register */
 | 
			
		||||
#define PCI_BAR_2	0x14	/* Base Address Register */
 | 
			
		||||
#define PCI_BAR_3	0x18	/* Base Address Register */
 | 
			
		||||
#define PCI_BAR_4	0x1C	/* Base Address Register */
 | 
			
		||||
#define PCI_ILR		0x3C	/* Interrupt Line Register */
 | 
			
		||||
#define PCI_IPR		0x3D	/* Interrupt Pin Register */
 | 
			
		||||
 | 
			
		||||
/* Device type values as ([PCI_BCR] << 16) | ([PCI_SCR] << 8) | [PCI_PIFR] */
 | 
			
		||||
#define	PCI_T3_PCI2PCI		0x060400	/* PCI-to-PCI Bridge device */
 | 
			
		||||
#define	PCI_T3_PCI2PCI_SUBTR	0x060401	/* Subtr. PCI-to-PCI Bridge */
 | 
			
		||||
 | 
			
		||||
/* PCI bridge devices (AGP) */
 | 
			
		||||
#define PPB_SBUSN	0x19	/* Secondary Bus Number */
 | 
			
		||||
 | 
			
		||||
/* Intel compatible PCI bridge devices (AGP) */
 | 
			
		||||
#define PPB_SSTS	0x1E	/* Secondary PCI-to-PCI Status Register */
 | 
			
		||||
 | 
			
		||||
#define NO_VID		0xffff	/* No PCI card present */
 | 
			
		||||
 | 
			
		||||
struct pci_vendor
 | 
			
		||||
{
 | 
			
		||||
	u16_t vid;
 | 
			
		||||
@ -99,8 +66,9 @@ struct pci_pcibridge
 | 
			
		||||
#define PCI_IB_AMD	3	/* AMD compatible ISA bridge */
 | 
			
		||||
#define PCI_IB_SIS	4	/* SIS compatible ISA bridge */
 | 
			
		||||
 | 
			
		||||
#define PCI_PCIB_INTEL	1	/* Intel compatible PCI bridge */
 | 
			
		||||
#define PCI_AGPB_INTEL	2	/* Intel compatible AGP bridge */
 | 
			
		||||
#define PCI_PPB_STD	1	/* Standard PCI-to-PCI bridge */
 | 
			
		||||
#define PCI_PPB_CB	2	/* Cardbus bridge */
 | 
			
		||||
/* Still needed? */
 | 
			
		||||
#define PCI_AGPB_VIA	3	/* VIA compatible AGP bridge */
 | 
			
		||||
 | 
			
		||||
extern struct pci_vendor pci_vendor_table[];
 | 
			
		||||
@ -111,6 +79,10 @@ extern struct pci_intel_ctrl pci_intel_ctrl[];
 | 
			
		||||
extern struct pci_isabridge pci_isabridge[];
 | 
			
		||||
extern struct pci_pcibridge pci_pcibridge[];
 | 
			
		||||
 | 
			
		||||
/* Utility functions */
 | 
			
		||||
_PROTOTYPE( void pci_reserve2, (int devind, char name[M3_STRING])	);
 | 
			
		||||
_PROTOTYPE( void pci_release, (char name[M3_STRING])			);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * $PchId: pci.h,v 1.4 2001/12/06 20:21:22 philip Exp $
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,7 @@ struct pci_vendor pci_vendor_table[]=
 | 
			
		||||
	{ 0x105A, "Promise Technology" },
 | 
			
		||||
	{ 0x10B7, "3Com Corporation" },
 | 
			
		||||
	{ 0x10B9, "AcerLabs (ALI)" },
 | 
			
		||||
	{ 0x10C8, "Neomagic Corporation" },
 | 
			
		||||
	{ 0x10DE, "nVidia Corporation" },
 | 
			
		||||
	{ 0x10EC, "Realtek" },
 | 
			
		||||
	{ 0x1106, "VIA" },
 | 
			
		||||
@ -77,6 +78,8 @@ struct pci_device pci_device_table[]=
 | 
			
		||||
	{ 0x10B9, 0x5229, "ALI M5229 (IDE)" },
 | 
			
		||||
	{ 0x10B9, 0x5243, "ALI M5243" },
 | 
			
		||||
	{ 0x10B9, 0x7101, "ALI M7101 PMU" },
 | 
			
		||||
	{ 0x10C8, 0x0005, "Neomagic NM2200 Magic Graph 256AV" },
 | 
			
		||||
	{ 0x10C8, 0x8005, "Neomagic NM2200 Magic Graph 256AV Audio" },
 | 
			
		||||
	{ 0x10DE, 0x0020, "nVidia Riva TnT [NV04]" },
 | 
			
		||||
	{ 0x10DE, 0x0110, "nVidia GeForce2 MX [NV11]" },
 | 
			
		||||
	{ 0x10EC, 0x8029, "Realtek RTL8029" },
 | 
			
		||||
@ -274,15 +277,17 @@ struct pci_isabridge pci_isabridge[]=
 | 
			
		||||
 | 
			
		||||
struct pci_pcibridge pci_pcibridge[]=
 | 
			
		||||
{
 | 
			
		||||
	{ 0x8086, 0x1A31, PCI_AGPB_INTEL, },	/* Intel 82845B/A AGP Bridge */
 | 
			
		||||
#if 0
 | 
			
		||||
	{ 0x8086, 0x1A31, PCI_PCIB_INTEL, },	/* Intel 82845B/A AGP Bridge */
 | 
			
		||||
	{ 0x8086, 0x2448, PCI_PCIB_INTEL, },	/* Intel 82801 Mobile */
 | 
			
		||||
	{ 0x8086, 0x244e, PCI_PCIB_INTEL, },	/* Intel 82801 PCI Bridge */
 | 
			
		||||
	{ 0x8086, 0x2561, PCI_AGPB_INTEL, },	/* Intel 82845 AGP Bridge */
 | 
			
		||||
	{ 0x8086, 0x7191, PCI_AGPB_INTEL, },	/* Intel 82443BX (AGP bridge) */
 | 
			
		||||
	{ 0x1022, 0x700D, PCI_AGPB_INTEL, },	/* AMD-762 (AGP 4x) */
 | 
			
		||||
	{ 0x10B9, 0x5243, PCI_AGPB_INTEL, },	/* ALI M5243 */
 | 
			
		||||
	{ 0x8086, 0x2561, PCI_PCIB_INTEL, },	/* Intel 82845 AGP Bridge */
 | 
			
		||||
	{ 0x8086, 0x7191, PCI_PCIB_INTEL, },	/* Intel 82443BX (AGP bridge) */
 | 
			
		||||
	{ 0x1022, 0x700D, PCI_PCIB_INTEL, },	/* AMD-762 (AGP 4x) */
 | 
			
		||||
	{ 0x10B9, 0x5243, PCI_PCIB_INTEL, },	/* ALI M5243 */
 | 
			
		||||
	{ 0x1106, 0x8305, PCI_AGPB_VIA, },	/* VIA VT8365 [KM133 AGP] */
 | 
			
		||||
	{ 0x1106, 0xB188, PCI_AGPB_VIA, },	/* VT8237 PCI bridge */
 | 
			
		||||
#endif
 | 
			
		||||
	{ 0x0000, 0x0000, 0, },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user