📄 xscale_test.c
字号:
printf ("OISR = 0x%X\n", *OutboundIstatReg);
printf ("**** PCI INTC Success ****\n\n");
*OutboundDbReg |= OB_DBELL_INTC; /* try to clear specific source */
return (1);
}
break;
case INTD:
/* check to see if we are looking at the correct interrupt */
if (!(*OutboundIstatReg & OB_STAT_INTD))
{
#if 0
printf ("OISR Mismatch!\n");
printf ("OISR = 0x%X\n", *OutboundIstatReg);
printf ("**** PCI INTD Error ****\n\n");
/* try to clear all sources */
*OutboundDbReg = (OB_DBELL_INTA|OB_DBELL_INTB|OB_DBELL_INTC|OB_DBELL_INTD);
#endif
return (0);
}
else
{
printf ("PCI INTD generated/received\n\n");
printf ("OISR OK!\n");
printf ("OISR = 0x%X\n", *OutboundIstatReg);
printf ("**** PCI INTD Success ****\n\n");
*OutboundDbReg |= OB_DBELL_INTD; /* try to clear specific source */
return (1);
}
break;
default:
printf ("Unknown interrupt received\n");
return (0);
break;
}
return (1); /* interrupt sharing support requirement */
}
/*******************************************************************************
*
* i960Rx_seek - look for i960Rx CPUs on the PCI Bus
*
* This function is used by the PCI interrupt test to find and print out
* all PCI location of a particular i960Rx processor on the PCI bus. Thses include
* boards based on the RP, RD, RM, and RN processors. The device ID of one of
* these processors is the input to the function.
*
*/
static void i960Rx_seek (UINT32 adapter_device_id)
{
int dev_index = 0;
PCI_DEVICE_LOCATION dev_info;
static char *i960Rx_name;
/* get the common name for the current Rx processor */
switch (adapter_device_id)
{
case I80960RN_ATU:
i960Rx_name = " i960RN ";
break;
case I80960RM_ATU:
i960Rx_name = " i960RM ";
break;
case I80960RP_ATU:
i960Rx_name = "i960RP/RD";
break;
case I80303_ATU:
default:
i960Rx_name = " i80303 ";
break;
}
while (Device_Seek (FALSE, VENDOR_INTEL,
adapter_device_id,
dev_index, &dev_info) == OK)
{
/* set up this entry into the device array */
i960Rx_devices[num_rx_devices].device_id = adapter_device_id;
i960Rx_devices[num_rx_devices].busno = dev_info.bus_number;
i960Rx_devices[num_rx_devices].devno = dev_info.device_number;
i960Rx_devices[num_rx_devices].funcno = dev_info.function_number;
printf (" %d %s %d %d %d\n",
num_rx_devices, i960Rx_name,
i960Rx_devices[num_rx_devices].busno,
i960Rx_devices[num_rx_devices].devno,
i960Rx_devices[num_rx_devices].funcno);
dev_index++; /* increment number of current i960Rx devices found */
num_rx_devices++; /* increment total number of i960Rx devices found */
}
}
/*********************************************************************************
*
* pci_int_test - tests PCI interrupts on IQ80310 PCI buses
*
* This test allows full testing of PCI interrupt routing to a particular
* slot on the PCI bus. It runs in conjunction with a Cyclone i960Rx-based
* board plugged into the target slot. A default interrupt handler is connected
* for all four PCI interrupt pins on the target board. The test then waits for
* the target board to trigger each interrupt using the i960Rx doorbell registers.
* The test passes if all four interrupts are recieved and properly handled by the
* IQ80310.
*
*/
void pci_int_test (void)
{
PCI_DEVICE_LOCATION devloc;
int indexChoice = 0;
UINT32 long_data;
UINT32 *OutboundImaskReg;
int intline_INTA, intline_INTB, intline_INTC, intline_INTD;
num_rx_devices = 0;
printf ("Scanning PCI Bus for all supported i960Rx ATU Devices.....\n\n");
printf (" Index Processor Bus Device Function\n");
printf (" ----- --------- --- ------ --------\n");
i960Rx_seek (I80960RN_ATU);
i960Rx_seek (I80960RM_ATU);
i960Rx_seek (I80960RP_ATU);
i960Rx_seek (I80303_ATU);
if (num_rx_devices == 0)
{
printf ("\n*** No i960Rx ATU Found on PCI Bus ***\n");
return;
}
printf ("Enter index number to use for test : ");
indexChoice = decIn();
printf ("\n\n");
if (indexChoice >= num_rx_devices)
{
printf ("Invalid index chosen, exiting\n");
return;
}
devloc.bus_number = i960Rx_devices[indexChoice].busno;
devloc.device_number = i960Rx_devices[indexChoice].devno;
devloc.function_number = i960Rx_devices[indexChoice].funcno;
sys_read_config_dword (devloc.bus_number,
devloc.device_number,
devloc.function_number,
REGION0_BASE_OFFSET,(UINT32*)&long_data);
messagingUnitBase = long_data & 0xfffffff0;
printf ("Messaging Unit PCI Base Address = 0x%X\n", messagingUnitBase);
OutboundImaskReg = (UINT32 *)(messagingUnitBase + 0x34);
/* Normally, we would just read the intline value from the configuration
space to determine where the interrupt is routed. However, the i960Rx
only requested interrupt resources for one interrupt at a time... */
/* compute interrupt routing values */
if ((pci_to_xint(devloc.device_number, INTA, (int*)&intline_INTA)) ||
(pci_to_xint(devloc.device_number, INTB, (int*)&intline_INTB)) ||
(pci_to_xint(devloc.device_number, INTC, (int*)&intline_INTC)) ||
(pci_to_xint(devloc.device_number, INTD, (int*)&intline_INTD)) == ERROR)
{
printf ("Error: Unable to connect PCI interrupts with IQ80310 interrupts\n");
return;
}
printf ("i960Rx INTA pin mapped to intLine %s on IQ80310\n", line_to_string(intline_INTA));
printf ("i960Rx INTB pin mapped to intLine %s on IQ80310\n", line_to_string(intline_INTB));
printf ("i960Rx INTC pin mapped to intLine %s on IQ80310\n", line_to_string(intline_INTC));
printf ("i960Rx INTD pin mapped to intLine %s on IQ80310\n", line_to_string(intline_INTD));
/* Connect i960Rx PCI INTA Handler */
if (pci_isr_connect (INTA, devloc.bus_number, devloc.device_number, PCI_IntHandler, INTA)
== ERROR )
{
printf ("Error Connecting INTA interrupt handler\n");
return;
}
printf ("INTA Service Routine installed...\n");
/* enable PCI INTA */
enable_external_interrupt(SINTA_INT_ID);
/* Connect i960Rx PCI INTB Handler */
if (pci_isr_connect (INTB, devloc.bus_number, devloc.device_number, PCI_IntHandler, INTB)
== ERROR)
{
printf ("Error Connecting INTB interrupt handler\n");
return;
}
printf ("INTB Service Routine installed...\n");
/* enable PCI INTB */
enable_external_interrupt(SINTB_INT_ID);
/* Connect i960Rx PCI INTC Handler */
if (pci_isr_connect (INTC, devloc.bus_number, devloc.device_number, PCI_IntHandler, INTC)
== ERROR)
{
printf ("Error Connecting INTC interrupt handler\n");
return;
}
printf ("INTC Service Routine installed...\n");
/* enable PCI INTC */
enable_external_interrupt(SINTC_INT_ID);
/* Connect i960Rx PCI INTD Handler */
if (pci_isr_connect (INTD, devloc.bus_number, devloc.device_number, PCI_IntHandler, INTD)
== ERROR)
{
printf ("Error Connecting INTD interrupt handler\n");
return;
}
printf ("INTD Service Routine installed...\n");
/* enable PCI INTD */
enable_external_interrupt(SINTD_INT_ID);
/* make sure that the Outbound interrupts aren't masked */
*OutboundImaskReg &= ~(OB_STAT_INTA | OB_STAT_INTB | OB_STAT_INTC | OB_STAT_INTD);
/* let the ISR do the rest of the work... */
printf ("Waiting for the PCI Interrupts to be received...\n\n");
printf ("Hit <CR> when the test is complete\n\n\n");
hexIn();
return;
}
/*******************************************/
/* Battery Backup SDRAM memory write test */
/*******************************************/
static void battery_test_write (void)
{
unsigned long start_addr = SDRAM_BATTERY_TEST_BASE; /* Address to write to */
/* Data to be written to address and read after the board has been powered off and powered back on */
UINT32 junk = BATTERY_TEST_PATTERN;
*(volatile UINT32 *)start_addr = junk;
printf("\nThe value '");
hex32out(BATTERY_TEST_PATTERN);
printf ("' is now written in DRAM at address $");
hex32out(SDRAM_BATTERY_TEST_BASE);
printf(".\n\nYou can now power the board off, wait 60 seconds and power it back on.");
printf("\nThen come back in the battery test menu and select option 2 to check data from DRAM.\n");
printf ("\nPress return to continue.\n");
(void) hexIn();
}
/******************************************/
/* Battery Backup SDRAM memory read test */
/******************************************/
static void battery_test_read (void)
{
unsigned long start_addr = SDRAM_BATTERY_TEST_BASE; /* Address to read from */
UINT32 value_written = BATTERY_TEST_PATTERN; /* Data that was written */
UINT32 value_read;
value_read = *(volatile UINT32 *)start_addr;
printf ("Value written at address $");
hex32out(SDRAM_BATTERY_TEST_BASE);
printf (": ");
hex32out(BATTERY_TEST_PATTERN);
printf ("\nValue read at address $");
hex32out(SDRAM_BATTERY_TEST_BASE);
printf(" : ");
hex32out(value_read);
if (value_read == value_written) printf ("\n\nThe battery test is a success !\n");
else
{
printf ("\n\n****************************\n");
printf ("* The battery test failed. *\n");
printf ("****************************\n");
}
printf ("\nBattery test done.\n");
printf ("Press return to continue.\n");
(void) hexIn();
}
/*************************************/
/* Battery Backup SDRAM memory menu */
/*************************************/
static void battery_test_menu (void)
{
/* Test Menu Table */
static MENU_ITEM batteryMenu[] =
{
{"Write data to SDRAM", battery_test_write, NULL},
{"Check data from SDRAM", battery_test_read, NULL},
};
unsigned int num_menu_items = (sizeof (batteryMenu) / sizeof (batteryMenu[0]));
/* char menu_title[15] = "\n Battery Backup SDRAM memory test."; */
char menu_title[36] = "\n Battery Backup SDRAM memory test.";
printf ("\n*************************************************************************\n");
printf ("* This test will enable you to perform a battery test in 4 steps: *\n");
printf ("* 1/ Select option 1 to write the value '");
hex32out(BATTERY_TEST_PATTERN);
printf ("' to DRAM at address *\n* $");
hex32out(SDRAM_BATTERY_TEST_BASE);
printf (", *\n");
printf ("* 2/ Power the board off and wait 60 seconds, *\n");
printf ("* 3/ Power the board back on, *\n");
printf ("* 4/ Select option 2 to read at address $");
hex32out(SDRAM_BATTERY_TEST_BASE);
printf (" and compare the *\n* value to the value written '");
hex32out(BATTERY_TEST_PATTERN);
printf ("'. *\n");
printf ("*************************************************************************");
menu (batteryMenu, num_menu_items, menu_title, MENU_OPT_NONE);
printf ("\n");
}
/* 01/11/01 jwf */
/* Make the user select their host test platform type from a list of choices. */
/* If the user picks a Cyclone SB923 then modify the Outbound PCI Translate Register on the IQ80310 for the SB923 */
void select_host_test_system (void)
{
char selection;
printf("Select your Host test system\n\n");
printf("Make a selection by typing a number.\n\n");
printf("1 - Cyclone SB923\n");
printf("2 - Personal Computer or other\n");
do
{
selection = xgetchar();
}
while( (selection != '1') && (selection != '2') );
if (selection == '1')
{
/* Modify the Outbound PCI Translate Register for a SB923, at address 0x1254 */
*(volatile UINT32 *) POMWVR_ADDR = 0xa0000000;
}
}
/* 02/09/01 jwf */
/* Read the 80200 Coyanosa ID register */
/* Use a base address equal to the fourth memory location from the last memory location */
/* in a 32MB SDRAM DIMM */
/* Store from coprocessor register 15 to memory. */
/* ARM register R0 is the address after the transfer */
void read_coyanosa_id_reg (void)
{
__asm__ ("ldr r0, = 0xA1FFFFFC");
__asm__ ("mrc p15, 0, r1, c0, c0, 0");
__asm__ ("str r1, [r0], #0");
}
/* 02/09/01 jwf */
/*
*Display the following version information.
*1. Software version of Red Boot or Cygnus Cygmon Rom Monitor.
*2. Cpld version. Located in the 0xFE840000 (Read)
*3. Board Revision. Located at 0xFE830000 (Read)
*4. 80200 ID data Located in CP15 Register 0
*5. 80312 Stepping Located at 0x00001008
*/
void version_info (void)
{
char board_rev;
/* show revision information for operating system */
#if CYGNUS_CYGMON_OS
extern void version(void); /* is defined in monitor.c */
version();
#endif
#if REDHAT_REDBOOT_OS
extern void do_version(int argc, char *argv[]);/* is defined in main.c */
do_version(0,0);
#endif
board_rev = board_revision();
if ( board_rev >= BOARD_REV_E )
{
/* read Board revision register and adjust numeric revision to letter revision, 0x1 <--> A */
printf("\nBoard Revision = %c\n",(*BOARD_REV_REG_ADDR & BOARD_REV_MASK) + 'A' - 1 );
}
else
{
/* Board letter revision might be A or B or C or D */
printf("\nBoard Revision Unknown!\n");
}
/* read CPLD revision register and adjust numeric revision to letter revision, 0x1 <--> A */
printf("CPLD Revision = %c\n",(*CPLD_REV_REG_ADDR & BOARD_REV_MASK) + 'A' - 1 );
/* Read the 80200 Coyanosa ID register */
read_coyanosa_id_reg();
printf( "80200 Revision ID = 0x%x\n", ( *(volatile unsigned long *) COYANOSA_ID_BASE_ADDR) );
/* read the 80312 Yavapai Revision ID register */
printf( "80312 Revision ID = %d\n", (*(volatile unsigned char *) RIDR_ADDR) );
printf ("\n\nStrike <CR> to exit this test.\n\n");
hexIn();
}
/* 02/09/01 jwf */
/* Determine if the CPLD supports a Board Revision Register. */
/* If a Board Revision Register exists then return the board revision number read from a dedicated CPLD register at memory address 0xfe830000 */
/* Otherwise return a default board revision number. */
char board_revision ()
{
/* represents the ring indicator bit logic level in UART2 */
unsigned char ri_state;
/* holds a board revision number */
char board_rev;
/* access UART2 MSR at memory address 0xfe810006 through the CYGMON serial port, J9 */
ri_state = *( unsigned char * ) 0xfe810006;
ri_state &= RI_MASK;
/* RI# pin on UART2 is grounded */
/* CPLD design supports a Board Revision Register implemention */
if(ri_state == RI_MASK)
{
/* read Board Revision register and isolate LSN */
board_rev = (*BOARD_REV_REG_ADDR & BOARD_REV_MASK);
/* Board Rev is at E or higher */
if (board_rev >= BOARD_REV_E)
{
return (board_rev);
}
}
/* RI# pin on UART2 is pulled up to 3.3V. */
/* Unknown Board Revision! */
/* Unable to determine a board revision because the CPLD Board Revision Register */
/* was never implemented for IQ80310 PCI-700 board REVs A,B,C, or D. */
/* set a default board revision value of 0x2 <--> Rev B. */
board_rev = 0x2;
/* return a default value */
return (board_rev);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -