📄 amcclib.c
字号:
device_and_function,
register_number,
&data);
if (ret_status == SUCCESSFUL) {
/* Extract word */
*word_read = data & 0xffff;
}
return (ret_status);
}
/****************************************************************************/
/* */
/* READ_CONFIGURATION_DWORD */
/* */
/* Purpose: Reads a dword from the configuration space of a specific device */
/* */
/* Inputs: */
/* */
/* byte bus_number */
/* PCI bus to read configuration data from */
/* */
/* byte device_and_function */
/* Device Number in upper 5 bits, Function Number in lower 3 bits */
/* */
/* byte register_number */
/* Register Number of configuration space to read */
/* */
/* Outputs: */
/* */
/* dword *dword_read */
/* Dword read from Configuration Space */
/* */
/* Return Value - Indicates presence of device */
/* SUCCESSFUL - Device found */
/* NOT_SUCCESSFUL - BIOS error */
/* BAD_REGISTER_NUMBER - Invalid Register Number */
/* */
/****************************************************************************/
int read_configuration_dword(byte bus_number,
byte device_and_function,
byte register_number,
dword *dword_read)
{
int ret_status; /* Function Return Status */
dword data;
/* Call read_configuration_area function with dword data */
ret_status = read_configuration_area(READ_CONFIG_DWORD,
bus_number,
device_and_function,
register_number,
&data);
if (ret_status == SUCCESSFUL) {
/* Extract dword */
*dword_read = data;
}
return (ret_status);
}
/****************************************************************************/
/* */
/* READ_CONFIGURATION_AREA */
/* */
/* Purpose: Reads a byte/word/dword from the configuration space of a */
/* specific device */
/* */
/* Inputs: */
/* */
/* byte bus_number */
/* PCI bus to read configuration data from */
/* */
/* byte device_and_function */
/* Device Number in upper 5 bits, Function Number in lower 3 bits */
/* */
/* byte register_number */
/* Register Number of configuration space to read */
/* */
/* Outputs: */
/* */
/* dword *dword_read */
/* Dword read from Configuration Space */
/* */
/* Return Value - Indicates presence of device */
/* SUCCESSFUL - Device found */
/* NOT_SUCCESSFUL - BIOS error */
/* BAD_REGISTER_NUMBER - Invalid Register Number */
/* */
/****************************************************************************/
static int read_configuration_area(byte function,
byte bus_number,
byte device_and_function,
byte register_number,
dword *data)
{
int ret_status; /* Function Return Status */
word ax, flags; /* Temporary variables to hold register values */
dword ecx; /* Temporary variable to hold ECX register value */
SWI_REGS regs;
/* Load entry registers for PCI BIOS */
regs.ebx = (bus_number << 8) | device_and_function;
regs.edi = register_number;
regs.eax = (PCI_FUNCTION_ID << 8) | function;
/* Call PCI BIOS Int 1Ah interface */
_dx_real_int(0x1a, ®s);
/* Save registers before overwritten by compiler usage of registers */
ecx = regs.ecx;
ax = regs.eax & 0xffff;
flags = regs.flags;
/* First check if CARRY FLAG Set, if so, error has occurred */
if ((flags & CARRY_FLAG) == 0) {
/* Get Return code from BIOS */
ret_status = HIGH_BYTE(ax);
/* If successful, return data */
if (ret_status == SUCCESSFUL) {
*data = ecx;
}
}
else {
ret_status = NOT_SUCCESSFUL;
}
return (ret_status);
}
/****************************************************************************/
/* */
/* WRITE_CONFIGURATION_BYTE */
/* */
/* Purpose: Writes a byte to the configuration space of a specific device */
/* */
/* Inputs: */
/* */
/* byte bus_number */
/* PCI bus to write configuration data to */
/* */
/* byte device_and_function */
/* Device Number in upper 5 bits, Function Number in lower 3 bits */
/* */
/* byte register_number */
/* Register Number of configuration space to write */
/* */
/* byte byte_to_write */
/* Byte to write to Configuration Space */
/* */
/* Outputs: */
/* */
/* Return Value - Indicates presence of device */
/* SUCCESSFUL - Device found */
/* NOT_SUCCESSFUL - BIOS error */
/* BAD_REGISTER_NUMBER - Invalid Register Number */
/* */
/****************************************************************************/
int write_configuration_byte(byte bus_number,
byte device_and_function,
byte register_number,
byte byte_to_write)
{
int ret_status; /* Function Return Status */
/* Call write_configuration_area function with byte data */
ret_status = write_configuration_area(WRITE_CONFIG_BYTE,
bus_number,
device_and_function,
register_number,
byte_to_write);
return (ret_status);
}
/****************************************************************************/
/* */
/* WRITE_CONFIGURATION_WORD */
/* */
/* Purpose: Writes a word to the configuration space of a specific device */
/* */
/* Inputs: */
/* */
/* byte bus_number */
/* PCI bus to read configuration data from */
/* */
/* byte device_and_function */
/* Device Number in upper 5 bits, Function Number in lower 3 bits */
/* */
/* byte register_number */
/* Register Number of configuration space to read */
/* */
/* word word_to_write */
/* Word to write to Configuration Space */
/* */
/* Outputs: */
/* */
/* Return Value - Indicates presence of device */
/* SUCCESSFUL - Device found */
/* NOT_SUCCESSFUL - BIOS error */
/* BAD_REGISTER_NUMBER - Invalid Register Number */
/* */
/****************************************************************************/
int write_configuration_word(byte bus_number,
byte device_and_function,
byte register_number,
word word_to_write)
{
int ret_status; /* Function Return Status */
/* Call read_configuration_area function with word data */
ret_status = write_configuration_area(WRITE_CONFIG_WORD,
bus_number,
device_and_function,
register_number,
word_to_write);
return (ret_status);
}
/****************************************************************************/
/* */
/* WRITE_CONFIGURATION_DWORD */
/* */
/* Purpose: Reads a dword from the configuration space of a specific device */
/* */
/* Inputs: */
/* */
/* byte bus_number */
/* PCI bus to read configuration data from */
/* */
/* byte device_and_function */
/* Device Number in upper 5 bits, Function Number in lower 3 bits */
/* */
/* byte register_number */
/* Register Number of configuration space to read */
/* */
/* dword dword_to_write */
/* Dword to write to Configuration Space */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -