mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-25 23:10:32 +00:00
Change PCI device list function organization to make it as simple as possible to update with modern PCIDeviceList repo. ( https://www.github.com/Zeal-Operating-System/PCIDeviceList )
This commit is contained in:
parent
c37d26d621
commit
00bb30855d
6 changed files with 247 additions and 241 deletions
|
@ -25,7 +25,7 @@ $IV,1$----11/02/22 20:26:55----$IV,0$
|
||||||
* Add simple progress indicator to $LK+PU,"CopySingle",A="FF:::/Kernel/BlkDev/DiskCopy.ZC,jiffies > time"$ that progress as a percentage every 2 seconds.
|
* Add simple progress indicator to $LK+PU,"CopySingle",A="FF:::/Kernel/BlkDev/DiskCopy.ZC,jiffies > time"$ that progress as a percentage every 2 seconds.
|
||||||
* Replace SYS_FONT_PTR VGA ROM 16-bit mode aux font retrieval with $LK+PU,"FontAux",A="FI:::/Kernel/FontAux.ZC"$.
|
* Replace SYS_FONT_PTR VGA ROM 16-bit mode aux font retrieval with $LK+PU,"FontAux",A="FI:::/Kernel/FontAux.ZC"$.
|
||||||
* Lowered $LK+PU,"PTR_STARS_NUM",A="MN:PTR_STARS_NUM"$ from 4 to 3.
|
* Lowered $LK+PU,"PTR_STARS_NUM",A="MN:PTR_STARS_NUM"$ from 4 to 3.
|
||||||
* Moved $LK+PU,"PCILookUpSingle",A="MN:PCILookUpSingle"$, $LK+PU,"PCILookUpDevs",A="MN:PCILookUpDevs"$, $LK+PU,"PCIDevFind",A="MN:PCIDevFind"$, and $LK+PU,"PCIRep",A="MN:PCIRep"$ out of System/DevInfo.ZC to new file $LK+PU,"System/Utils/PCIRep.ZC",A="FI:::/System/Utils/PCIRep.ZC"$. Added including this file to $LK+PU,"MakeUtils",A="FF:::/System/Utils/MakeUtils.ZC,PCIRep"$.
|
* Moved $LK+PU,"PCILookUpSingle",A="MN:PCILookUpSingle"$ out of System/DevInfo.ZC to new file $LK+PU,"System/PCILookUpSingle.ZC",A="FI:::/System/PCILookUpSingle.ZC"$. Added including this file to $LK+PU,"MakeSystem",A="FF:::/System/MakeSystem.ZC,PCILook"$. This change makes it simpler to change and update the PCI device list text file parsing behaviour for modern PCI device lists.
|
||||||
* Removed VGAM_GRAPHICS, text.vga_alias, and all code/documentation referencing them or legacy VGA graphics. MiniGrLib now needs a complete rewrite.
|
* Removed VGAM_GRAPHICS, text.vga_alias, and all code/documentation referencing them or legacy VGA graphics. MiniGrLib now needs a complete rewrite.
|
||||||
* Added $LK+PU,"DF_KEEP_FLAGS",A="MN:DF_KEEP_FLAGS"$ and corresponding logic to $LK+PU,"Diff",A="FF:::/System/Utils/Diff.ZC,& DF_KEEP_FLAGS"$.
|
* Added $LK+PU,"DF_KEEP_FLAGS",A="MN:DF_KEEP_FLAGS"$ and corresponding logic to $LK+PU,"Diff",A="FF:::/System/Utils/Diff.ZC,& DF_KEEP_FLAGS"$.
|
||||||
* Changed $LK+PU,"BootMHDOldRead",A="MN:BootMHDOldRead"$ to take optional size argument, and changed $LK+PU,"BootMHDOldWrite",A="MN:BootMHDOldWrite"$ to use the OldMBR.BIN filesize to determine how many blocks to write. Used in $LK+PU,"LimineMHDIns",A="FF:::/System/Boot/LimineMHDIns.ZC,LimineMHDIns("$ to backup the MBR and post-MBR-gap to OldMBR.BIN.
|
* Changed $LK+PU,"BootMHDOldRead",A="MN:BootMHDOldRead"$ to take optional size argument, and changed $LK+PU,"BootMHDOldWrite",A="MN:BootMHDOldWrite"$ to use the OldMBR.BIN filesize to determine how many blocks to write. Used in $LK+PU,"LimineMHDIns",A="FF:::/System/Boot/LimineMHDIns.ZC,LimineMHDIns("$ to backup the MBR and post-MBR-gap to OldMBR.BIN.
|
||||||
|
|
|
@ -1,3 +1,112 @@
|
||||||
|
#help_index "PCI;Processor;Devices;Info"
|
||||||
|
|
||||||
|
U0 PCILookUpDevs()
|
||||||
|
{
|
||||||
|
CPCIDev *tmppci;
|
||||||
|
I64 w1, w2, b, d, f, timeout = 32 * 8 * 2;
|
||||||
|
CDoc *doc;
|
||||||
|
|
||||||
|
if (dev.pci_head.next != &dev.pci_head)
|
||||||
|
return;
|
||||||
|
doc = DocRead(PCI_DEV_FILE, DOCF_PLAIN_TEXT | DOCF_NO_CURSOR);
|
||||||
|
for (b = 0; b < sys_pci_buses; b++)
|
||||||
|
for (d = 0; d < 32; d++)
|
||||||
|
for (f = 0; f < 8; f++)
|
||||||
|
{
|
||||||
|
w1 = PCIReadU16(b, d, f, PCIR_VENDOR_ID);
|
||||||
|
Yield; // keep from hanging graphics on bare-metal
|
||||||
|
if (w1 != 0xFFFF)
|
||||||
|
{
|
||||||
|
tmppci = SysCAlloc(sizeof(CPCIDev));
|
||||||
|
tmppci->bus = b;
|
||||||
|
tmppci->dev = d;
|
||||||
|
tmppci->fun = f;
|
||||||
|
tmppci->vendor_id = w1;
|
||||||
|
tmppci->device_id = w2 = PCIReadU16(b, d, f, PCIR_DEVICE_ID);
|
||||||
|
tmppci->sub_code = PCIReadU8(b, d, f, PCIR_SUB_CODE);
|
||||||
|
tmppci->class_code = PCIReadU8(b, d, f, PCIR_CLASS_CODE);
|
||||||
|
tmppci->prog_if = PCIReadU8(b, d, f, PCIR_PROG_IF);
|
||||||
|
tmppci->revision_id = PCIReadU8(b, d, f, PCIR_REVISION_ID);
|
||||||
|
tmppci->bist = PCIReadU8(b, d, f, PCIR_BIST);
|
||||||
|
tmppci->header_type = PCIReadU8(b, d, f, PCIR_HEADER_TYPE);
|
||||||
|
tmppci->latency_timer=PCIReadU8(b, d, f, PCIR_LATENCY_TIMER);
|
||||||
|
tmppci->capabilities= PCIReadU8(b, d, f, PCIR_CAPABILITIES);
|
||||||
|
tmppci->cache_line_size=PCIReadU8(b, d, f, PCIR_CACHE_LINE_SIZE);
|
||||||
|
tmppci->subsys_id = PCIReadU16(b, d, f, PCIR_SUBSYS_ID);
|
||||||
|
tmppci->subsys_vendor_id=PCIReadU16(b, d, f, PCIR_SUBSYS_VENDOR_ID);
|
||||||
|
tmppci->erom = PCIReadU32(b, d, f, PCIR_EXPANSION_ROM);
|
||||||
|
tmppci->base[0] = PCIReadU32(b, d, f, PCIR_BASE0);
|
||||||
|
tmppci->base[1] = PCIReadU32(b, d, f, PCIR_BASE1);
|
||||||
|
tmppci->base[2] = PCIReadU32(b, d, f, PCIR_BASE2);
|
||||||
|
tmppci->base[3] = PCIReadU32(b, d, f, PCIR_BASE3);
|
||||||
|
tmppci->base[4] = PCIReadU32(b, d, f, PCIR_BASE4);
|
||||||
|
tmppci->base[5] = PCIReadU32(b, d, f, PCIR_BASE5);
|
||||||
|
PCILookUpSingle(doc, w1, w2, &tmppci->vendor_str, &tmppci->dev_id_str);
|
||||||
|
QueueInsert(tmppci, dev.pci_head.last);
|
||||||
|
timeout = 32 * 8 * 2;
|
||||||
|
}
|
||||||
|
else if (sys_pci_buses == 256 && --timeout <= 0)
|
||||||
|
goto lud_done;
|
||||||
|
}
|
||||||
|
lud_done:
|
||||||
|
DocDel(doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CPCIDev *PCIDevFind(U16 class_code=NULL, U16 sub_code=NULL,
|
||||||
|
U16 vendor_id=NULL, U16 device_id=NULL,
|
||||||
|
U8 _bus=0xFF, U8 _dev=0xFF, U8 _fun=0xFF)
|
||||||
|
{//return first device with matching class & subcode, vendor & device id, or a specific device.
|
||||||
|
PCILookUpDevs;
|
||||||
|
CPCIDev *p = dev.pci_head.next;
|
||||||
|
|
||||||
|
while (p != &dev.pci_head)
|
||||||
|
{
|
||||||
|
if (p->vendor_id == vendor_id && p->device_id == device_id ||
|
||||||
|
p->class_code == class_code && p->sub_code == sub_code ||
|
||||||
|
p->bus == _bus && p->dev == _dev && p->fun == _fun)
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public U0 PCIRep()
|
||||||
|
{//Report description of PCI devices.
|
||||||
|
CPCIDev *tmppci;
|
||||||
|
|
||||||
|
"PCI Buses:%d\n", sys_pci_buses;
|
||||||
|
if (!FileFind(PCI_DEV_FILE))
|
||||||
|
{
|
||||||
|
"You don't have the PCI device file.\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PCILookUpDevs;
|
||||||
|
tmppci = dev.pci_head.next;
|
||||||
|
if (!IsRaw)
|
||||||
|
"$$LTCYAN$$B :D :F CC-SC-PI\n$$FG$$";
|
||||||
|
else
|
||||||
|
"B :D :F CC-SC-PI\n";
|
||||||
|
while (tmppci != &dev.pci_head)
|
||||||
|
{
|
||||||
|
"%02X:%02X:%01X %02X-%02X-%02X ",
|
||||||
|
tmppci->bus, tmppci->dev, tmppci->fun,
|
||||||
|
tmppci->class_code, tmppci->sub_code, tmppci->prog_if;
|
||||||
|
if (!IsRaw)
|
||||||
|
"$$GREEN$$";
|
||||||
|
"%s ", tmppci->vendor_str;
|
||||||
|
if (!IsRaw)
|
||||||
|
"$$CYAN$$";
|
||||||
|
"%s", tmppci->dev_id_str;
|
||||||
|
if (!IsRaw)
|
||||||
|
"$$FG$$";
|
||||||
|
'\n';
|
||||||
|
,
|
||||||
|
tmppci=tmppci->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#help_index "Info;Memory/Info"
|
#help_index "Info;Memory/Info"
|
||||||
public U0 MemBIOSRep()
|
public U0 MemBIOSRep()
|
||||||
{//Report the memory ranges reported by the BIOS at boot.
|
{//Report the memory ranges reported by the BIOS at boot.
|
||||||
|
|
|
@ -20,6 +20,7 @@ LBts(&sys_run_level, RLf_DOC);
|
||||||
#include "God/MakeGod"
|
#include "God/MakeGod"
|
||||||
#include "Hash"
|
#include "Hash"
|
||||||
#include "TaskSettings"
|
#include "TaskSettings"
|
||||||
|
#include "PCILookUpSingle"
|
||||||
#include "DevInfo"
|
#include "DevInfo"
|
||||||
#include "Define"
|
#include "Define"
|
||||||
#include "WallPaper"
|
#include "WallPaper"
|
||||||
|
|
136
src/System/PCILookUpSingle.ZC
Executable file
136
src/System/PCILookUpSingle.ZC
Executable file
|
@ -0,0 +1,136 @@
|
||||||
|
#help_index "PCI;Processor;Devices;Info"
|
||||||
|
|
||||||
|
// PCILookUpSingle has been moved to its own file
|
||||||
|
// to make it simpler to update for modern PCI device lists.
|
||||||
|
// https://www.github.com/Zeal-Operating-System/PCIDeviceList
|
||||||
|
|
||||||
|
//The file was downloaded from
|
||||||
|
//http://www.pcidatabase.com/reports.php?type=tab-delimeted
|
||||||
|
|
||||||
|
#define PCI_DEV_FILE "::/Misc/PCIDevices.DD"
|
||||||
|
|
||||||
|
/****
|
||||||
|
//1) Download http://www.pcidatabase.com/reports.php?type=tab-delimeted
|
||||||
|
//2) Rename to ::/Misc/PCIDevices.DD
|
||||||
|
//3) ToDolDoc("::/Misc/PCIDevices.DD");
|
||||||
|
//4) Edit and remove file header and tail
|
||||||
|
//5) Text find-and-replace "=0A=" with "". (Doesn't seem necessary anmore.)
|
||||||
|
//6) Run PCIDevFileGen(). (Doesn't seem necessary anmore.)
|
||||||
|
|
||||||
|
public U0 PCIDevFileGen()
|
||||||
|
{
|
||||||
|
Bool first=TRUE,del=FALSE,del2=FALSE,cont=FALSE;
|
||||||
|
CDoc *doc=DocRead(PCI_DEV_FILE,
|
||||||
|
DOCF_PLAIN_TEXT|DOCF_DBL_DOLLARS|DOCF_NO_CURSOR);
|
||||||
|
CDocEntry *doc_e=doc->head.next,*doc_e2;
|
||||||
|
while (doc_e!=doc) {
|
||||||
|
doc_e2=doc_e->next;
|
||||||
|
if (first) {
|
||||||
|
if (doc_e->type_u8==DOCT_TEXT) {
|
||||||
|
if (doc_e->tag[0]==';')
|
||||||
|
del=TRUE;
|
||||||
|
}
|
||||||
|
first=FALSE;
|
||||||
|
}
|
||||||
|
if (doc_e->type_u8==DOCT_TEXT && doc_e->tag[StrLen(doc_e->tag)-1]=='=' &&
|
||||||
|
doc_e2->type_u8==DOCT_NEW_LINE) {
|
||||||
|
doc_e->tag[StrLen(doc_e->tag)-1]=CH_SPACE;
|
||||||
|
cont=TRUE;
|
||||||
|
}
|
||||||
|
del2=del;
|
||||||
|
if (doc_e->type_u8==DOCT_NEW_LINE) {
|
||||||
|
first=TRUE;
|
||||||
|
del2=FALSE;
|
||||||
|
if (cont) {
|
||||||
|
del=TRUE;
|
||||||
|
cont=FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (del)
|
||||||
|
DocEntryDel(doc,doc_e);
|
||||||
|
del=del2;
|
||||||
|
doc_e=doc_e2;
|
||||||
|
}
|
||||||
|
DocWrite(doc);
|
||||||
|
}
|
||||||
|
****/
|
||||||
|
|
||||||
|
//$LK,"::/Misc/PCIDevices.DD",A="PI:::/Misc/PCIDevices.DD"$
|
||||||
|
U0 PCILookUpSingle(CDoc *doc, I64 m, I64 d, U8 **_vendor, U8 **_dev)
|
||||||
|
{
|
||||||
|
Bool first = TRUE;
|
||||||
|
U8 buf[8], *vendor = NULL, *dev = NULL;
|
||||||
|
CDocEntry *doc_e = doc->head.next;
|
||||||
|
|
||||||
|
while (doc_e != doc)
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
if (doc_e->type_u8 == DOCT_TEXT && doc_e->tag[0] != ';' && StrLen(doc_e->tag) >= 4)
|
||||||
|
{
|
||||||
|
buf[0](U16) = '0x';
|
||||||
|
buf[2](U32) = doc_e->tag(U32 *)[0];
|
||||||
|
buf[6] = '\0';
|
||||||
|
if (Str2I64(buf) == m)
|
||||||
|
{
|
||||||
|
doc_e = doc_e->next->next->next;
|
||||||
|
if (doc_e->type_u8 == DOCT_TEXT)
|
||||||
|
{
|
||||||
|
vendor = SysStrNew(doc_e->tag);
|
||||||
|
first = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
first=FALSE;
|
||||||
|
}
|
||||||
|
if (doc_e->type_u8 == DOCT_NEW_LINE)
|
||||||
|
first = TRUE;
|
||||||
|
doc_e = doc_e->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vendor)
|
||||||
|
{
|
||||||
|
while (doc_e != doc)
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
{
|
||||||
|
if (doc_e->type_u8 == DOCT_TAB)
|
||||||
|
{
|
||||||
|
doc_e = doc_e->next->next->next->next;
|
||||||
|
if (doc_e->type_u8 == DOCT_TEXT && StrLen(doc_e->tag) >= 4)
|
||||||
|
{
|
||||||
|
buf[0](U16) = '0x';
|
||||||
|
buf[2](U32) = doc_e->tag(U32 *)[0];
|
||||||
|
buf[6] = '\0';
|
||||||
|
if (Str2I64(buf) == d)
|
||||||
|
{
|
||||||
|
doc_e = doc_e->next->next->next;
|
||||||
|
if (doc_e->type_u8 == DOCT_TEXT)
|
||||||
|
{
|
||||||
|
dev = SysStrNew(doc_e->tag);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
first = FALSE;
|
||||||
|
}
|
||||||
|
if (doc_e->type_u8 == DOCT_NEW_LINE)
|
||||||
|
first = TRUE;
|
||||||
|
doc_e = doc_e->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vendor)
|
||||||
|
*_vendor = vendor;
|
||||||
|
else
|
||||||
|
*_vendor = SysStrNew("Unknown");
|
||||||
|
|
||||||
|
if (dev)
|
||||||
|
*_dev = dev;
|
||||||
|
else
|
||||||
|
*_dev = SysStrNew("Unknown");
|
||||||
|
}
|
|
@ -17,6 +17,5 @@ Cd(__DIR__);;
|
||||||
#include "ToDolDoc"
|
#include "ToDolDoc"
|
||||||
#include "ToTXT"
|
#include "ToTXT"
|
||||||
#include "VideoRep"
|
#include "VideoRep"
|
||||||
#include "PCIRep"
|
|
||||||
|
|
||||||
Cd("..");;
|
Cd("..");;
|
||||||
|
|
|
@ -1,239 +0,0 @@
|
||||||
#help_index "PCI;Processor;Devices;Info"
|
|
||||||
|
|
||||||
//The file was downloaded from
|
|
||||||
//http://www.pcidatabase.com/reports.php?type=tab-delimeted
|
|
||||||
|
|
||||||
#define PCI_DEV_FILE "::/Misc/PCIDevices.DD"
|
|
||||||
|
|
||||||
/****
|
|
||||||
//1) Download http://www.pcidatabase.com/reports.php?type=tab-delimeted
|
|
||||||
//2) Rename to ::/Misc/PCIDevices.DD
|
|
||||||
//3) ToDolDoc("::/Misc/PCIDevices.DD");
|
|
||||||
//4) Edit and remove file header and tail
|
|
||||||
//5) Text find-and-replace "=0A=" with "". (Doesn't seem necessary anmore.)
|
|
||||||
//6) Run PCIDevFileGen(). (Doesn't seem necessary anmore.)
|
|
||||||
|
|
||||||
public U0 PCIDevFileGen()
|
|
||||||
{
|
|
||||||
Bool first=TRUE,del=FALSE,del2=FALSE,cont=FALSE;
|
|
||||||
CDoc *doc=DocRead(PCI_DEV_FILE,
|
|
||||||
DOCF_PLAIN_TEXT|DOCF_DBL_DOLLARS|DOCF_NO_CURSOR);
|
|
||||||
CDocEntry *doc_e=doc->head.next,*doc_e2;
|
|
||||||
while (doc_e!=doc) {
|
|
||||||
doc_e2=doc_e->next;
|
|
||||||
if (first) {
|
|
||||||
if (doc_e->type_u8==DOCT_TEXT) {
|
|
||||||
if (doc_e->tag[0]==';')
|
|
||||||
del=TRUE;
|
|
||||||
}
|
|
||||||
first=FALSE;
|
|
||||||
}
|
|
||||||
if (doc_e->type_u8==DOCT_TEXT && doc_e->tag[StrLen(doc_e->tag)-1]=='=' &&
|
|
||||||
doc_e2->type_u8==DOCT_NEW_LINE) {
|
|
||||||
doc_e->tag[StrLen(doc_e->tag)-1]=CH_SPACE;
|
|
||||||
cont=TRUE;
|
|
||||||
}
|
|
||||||
del2=del;
|
|
||||||
if (doc_e->type_u8==DOCT_NEW_LINE) {
|
|
||||||
first=TRUE;
|
|
||||||
del2=FALSE;
|
|
||||||
if (cont) {
|
|
||||||
del=TRUE;
|
|
||||||
cont=FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (del)
|
|
||||||
DocEntryDel(doc,doc_e);
|
|
||||||
del=del2;
|
|
||||||
doc_e=doc_e2;
|
|
||||||
}
|
|
||||||
DocWrite(doc);
|
|
||||||
}
|
|
||||||
****/
|
|
||||||
|
|
||||||
//$LK,"::/Misc/PCIDevices.DD",A="PI:::/Misc/PCIDevices.DD"$
|
|
||||||
U0 PCILookUpSingle(CDoc *doc, I64 m, I64 d, U8 **_vendor, U8 **_dev)
|
|
||||||
{
|
|
||||||
Bool first = TRUE;
|
|
||||||
U8 buf[8], *vendor = NULL, *dev = NULL;
|
|
||||||
CDocEntry *doc_e = doc->head.next;
|
|
||||||
|
|
||||||
while (doc_e != doc)
|
|
||||||
{
|
|
||||||
if (first)
|
|
||||||
{
|
|
||||||
if (doc_e->type_u8 == DOCT_TEXT && doc_e->tag[0] != ';' && StrLen(doc_e->tag) >= 4)
|
|
||||||
{
|
|
||||||
buf[0](U16) = '0x';
|
|
||||||
buf[2](U32) = doc_e->tag(U32 *)[0];
|
|
||||||
buf[6] = '\0';
|
|
||||||
if (Str2I64(buf) == m)
|
|
||||||
{
|
|
||||||
doc_e = doc_e->next->next->next;
|
|
||||||
if (doc_e->type_u8 == DOCT_TEXT)
|
|
||||||
{
|
|
||||||
vendor = SysStrNew(doc_e->tag);
|
|
||||||
first = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
first=FALSE;
|
|
||||||
}
|
|
||||||
if (doc_e->type_u8 == DOCT_NEW_LINE)
|
|
||||||
first = TRUE;
|
|
||||||
doc_e = doc_e->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vendor)
|
|
||||||
{
|
|
||||||
while (doc_e != doc)
|
|
||||||
{
|
|
||||||
if (first)
|
|
||||||
{
|
|
||||||
if (doc_e->type_u8 == DOCT_TAB)
|
|
||||||
{
|
|
||||||
doc_e = doc_e->next->next->next->next;
|
|
||||||
if (doc_e->type_u8 == DOCT_TEXT && StrLen(doc_e->tag) >= 4)
|
|
||||||
{
|
|
||||||
buf[0](U16) = '0x';
|
|
||||||
buf[2](U32) = doc_e->tag(U32 *)[0];
|
|
||||||
buf[6] = '\0';
|
|
||||||
if (Str2I64(buf) == d)
|
|
||||||
{
|
|
||||||
doc_e = doc_e->next->next->next;
|
|
||||||
if (doc_e->type_u8 == DOCT_TEXT)
|
|
||||||
{
|
|
||||||
dev = SysStrNew(doc_e->tag);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
first = FALSE;
|
|
||||||
}
|
|
||||||
if (doc_e->type_u8 == DOCT_NEW_LINE)
|
|
||||||
first = TRUE;
|
|
||||||
doc_e = doc_e->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vendor)
|
|
||||||
*_vendor = vendor;
|
|
||||||
else
|
|
||||||
*_vendor = SysStrNew("Unknown");
|
|
||||||
|
|
||||||
if (dev)
|
|
||||||
*_dev = dev;
|
|
||||||
else
|
|
||||||
*_dev = SysStrNew("Unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
U0 PCILookUpDevs()
|
|
||||||
{
|
|
||||||
CPCIDev *tmppci;
|
|
||||||
I64 w1, w2, b, d, f, timeout = 32 * 8 * 2;
|
|
||||||
CDoc *doc;
|
|
||||||
|
|
||||||
if (dev.pci_head.next != &dev.pci_head)
|
|
||||||
return;
|
|
||||||
doc = DocRead(PCI_DEV_FILE, DOCF_PLAIN_TEXT | DOCF_NO_CURSOR);
|
|
||||||
for (b = 0; b < sys_pci_buses; b++)
|
|
||||||
for (d = 0; d < 32; d++)
|
|
||||||
for (f = 0; f < 8; f++)
|
|
||||||
{
|
|
||||||
w1 = PCIReadU16(b, d, f, PCIR_VENDOR_ID);
|
|
||||||
Yield; // keep from hanging graphics on bare-metal
|
|
||||||
if (w1 != 0xFFFF)
|
|
||||||
{
|
|
||||||
tmppci = SysCAlloc(sizeof(CPCIDev));
|
|
||||||
tmppci->bus = b;
|
|
||||||
tmppci->dev = d;
|
|
||||||
tmppci->fun = f;
|
|
||||||
tmppci->vendor_id = w1;
|
|
||||||
tmppci->device_id = w2 = PCIReadU16(b, d, f, PCIR_DEVICE_ID);
|
|
||||||
tmppci->sub_code = PCIReadU8(b, d, f, PCIR_SUB_CODE);
|
|
||||||
tmppci->class_code = PCIReadU8(b, d, f, PCIR_CLASS_CODE);
|
|
||||||
tmppci->prog_if = PCIReadU8(b, d, f, PCIR_PROG_IF);
|
|
||||||
tmppci->revision_id = PCIReadU8(b, d, f, PCIR_REVISION_ID);
|
|
||||||
tmppci->bist = PCIReadU8(b, d, f, PCIR_BIST);
|
|
||||||
tmppci->header_type = PCIReadU8(b, d, f, PCIR_HEADER_TYPE);
|
|
||||||
tmppci->latency_timer=PCIReadU8(b, d, f, PCIR_LATENCY_TIMER);
|
|
||||||
tmppci->capabilities= PCIReadU8(b, d, f, PCIR_CAPABILITIES);
|
|
||||||
tmppci->cache_line_size=PCIReadU8(b, d, f, PCIR_CACHE_LINE_SIZE);
|
|
||||||
tmppci->subsys_id = PCIReadU16(b, d, f, PCIR_SUBSYS_ID);
|
|
||||||
tmppci->subsys_vendor_id=PCIReadU16(b, d, f, PCIR_SUBSYS_VENDOR_ID);
|
|
||||||
tmppci->erom = PCIReadU32(b, d, f, PCIR_EXPANSION_ROM);
|
|
||||||
tmppci->base[0] = PCIReadU32(b, d, f, PCIR_BASE0);
|
|
||||||
tmppci->base[1] = PCIReadU32(b, d, f, PCIR_BASE1);
|
|
||||||
tmppci->base[2] = PCIReadU32(b, d, f, PCIR_BASE2);
|
|
||||||
tmppci->base[3] = PCIReadU32(b, d, f, PCIR_BASE3);
|
|
||||||
tmppci->base[4] = PCIReadU32(b, d, f, PCIR_BASE4);
|
|
||||||
tmppci->base[5] = PCIReadU32(b, d, f, PCIR_BASE5);
|
|
||||||
PCILookUpSingle(doc, w1, w2, &tmppci->vendor_str, &tmppci->dev_id_str);
|
|
||||||
QueueInsert(tmppci, dev.pci_head.last);
|
|
||||||
timeout = 32 * 8 * 2;
|
|
||||||
}
|
|
||||||
else if (sys_pci_buses == 256 && --timeout <= 0)
|
|
||||||
goto lud_done;
|
|
||||||
}
|
|
||||||
lud_done:
|
|
||||||
DocDel(doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CPCIDev *PCIDevFind(U16 class_code=NULL, U16 sub_code=NULL,
|
|
||||||
U16 vendor_id=NULL, U16 device_id=NULL,
|
|
||||||
U8 _bus=0xFF, U8 _dev=0xFF, U8 _fun=0xFF)
|
|
||||||
{//return first device with matching class & subcode, vendor & device id, or a specific device.
|
|
||||||
PCILookUpDevs;
|
|
||||||
CPCIDev *p = dev.pci_head.next;
|
|
||||||
|
|
||||||
while (p != &dev.pci_head)
|
|
||||||
{
|
|
||||||
if (p->vendor_id == vendor_id && p->device_id == device_id ||
|
|
||||||
p->class_code == class_code && p->sub_code == sub_code ||
|
|
||||||
p->bus == _bus && p->dev == _dev && p->fun == _fun)
|
|
||||||
|
|
||||||
return p;
|
|
||||||
|
|
||||||
p = p->next;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
public U0 PCIRep()
|
|
||||||
{//Report description of PCI devices.
|
|
||||||
CPCIDev *tmppci;
|
|
||||||
|
|
||||||
"PCI Buses:%d\n", sys_pci_buses;
|
|
||||||
if (!FileFind(PCI_DEV_FILE))
|
|
||||||
{
|
|
||||||
"You don't have the PCI device file.\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
PCILookUpDevs;
|
|
||||||
tmppci = dev.pci_head.next;
|
|
||||||
if (!IsRaw)
|
|
||||||
"$$LTCYAN$$B :D :F CC-SC-PI\n$$FG$$";
|
|
||||||
else
|
|
||||||
"B :D :F CC-SC-PI\n";
|
|
||||||
while (tmppci != &dev.pci_head)
|
|
||||||
{
|
|
||||||
"%02X:%02X:%01X %02X-%02X-%02X ",
|
|
||||||
tmppci->bus, tmppci->dev, tmppci->fun,
|
|
||||||
tmppci->class_code, tmppci->sub_code, tmppci->prog_if;
|
|
||||||
if (!IsRaw)
|
|
||||||
"$$GREEN$$";
|
|
||||||
"%s ", tmppci->vendor_str;
|
|
||||||
if (!IsRaw)
|
|
||||||
"$$CYAN$$";
|
|
||||||
"%s", tmppci->dev_id_str;
|
|
||||||
if (!IsRaw)
|
|
||||||
"$$FG$$";
|
|
||||||
'\n';
|
|
||||||
,
|
|
||||||
tmppci=tmppci->next;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue