We are developing a system with a custom processor, Microblaze and some peripherals in VC709 FPGA using Xilinx Vivado. We are using two 'PCIe : BARs' in 'AXI Bridge for PCI express gen 3'.
The changes we make in the block configuration of the PCI express block are not getting reflected on the host side.
For example, when we set the BAR0 for 2GB and BAR1 for 2MB, we get two regions of 4KB and 4MB. And this doesn't change when we tried varying different BAR combinations.
$lspci -vv
0a:00.0 Memory controller: Xilinx Corporation Device 7038
Subsystem: Xilinx Corporation Device 0007
Physical Slot: 3
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 16
Region 0: Memory at fbff0000 (32-bit, non-prefetchable) [size=4K]
Region 1: Memory at fb800000 (32-bit, non-prefetchable) [size=4M]
Capabilities: <access denied>
Kernel modules: riffa
How can I debug it?
Solution
I have been using Xilinx SDK for programming the FPGA. But it the SDK was always loading an old bit stream. I have solved it by programming the FPGA through Vivado itself.
Tools > Xilinx hardware manager > open target > autoconnect > program device
Credits: Mandar Datar (HPC Lab, Dept of EE, IIT Bombay)
I can get Device Descriptor :
bcdUSB: 0x0200
bDeviceClass: 0xEF
bDeviceSubClass: 0x02
bDeviceProtocol: 0x01
bMaxPacketSize0: 0x40 (64)
idVendor: 0x045E (Microsoft Corporation)
idProduct: 0x0728
bcdDevice: 0x0100
iManufacturer: 0x01
0x0409: "Microsoft"
iProduct: 0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber: 0x00
bNumConfigurations: 0x01,
How to get the type of USB(phone,USB flash disk,Wireless network card,ect.) through the USB device descriptor? (Forgive my clumsy English.My mother tongue is not English.)
This is the parameter of my iphone and my usb drive. What parameters should I use to distinguish different devices? BDeviceClass doesn't seem to work?
Lookup bDeviceClass against https://usb-ids.gowdy.us/read/UC/ - device classes. There 0xEF is Miscellaneous Device.
And idVendor and idProduct against https://usb-ids.gowdy.us/read/UD/ - specific devices. There 0x045E is Microsoft and 0x0728 is LifeCam VX-5000 - https://usb-ids.gowdy.us/read/UD/045e/0728
Value of BDeviceClass is 00 represents the device is finally defined on the interface.We need to find the corresponding configuration descriptor and then get the corresponding interface descriptor through the configuration descriptor.Then we can get 'bInterfaceClass',which represents device .enter image description here
i have device with two xilinx PCI cards connected to PCIe and the device architecture is PowerPC. I can switch the kernel version by making symlink in the /boot directory.
On 3.14 kernel lspci produces:
0000:00:00.0 Class 0604: Device 1957:0070 (rev 21)
0000:01:00.0 Class 0200: Device 1234:0045 (rev 78)
0001:02:00.0 Class 0604: Device 1957:0070 (rev 21)
0001:03:00.0 Class 0200: Device 1234:0100 (rev 63)
And on 4.9 kernel lspci produces:
9000:00:00.0 Class 0604: Device 1957:0070 (rev 21)
9000:01:00.0 Class 0200: Device 1234:0045 (rev 78)
a000:02:00.0 Class 0604: Device 1957:0070 (rev 21)
a000:03:00.0 Class 0200: Device 1234:0100 (rev 63)
lspci output corresponds to /sys/bus/pci/devices/ directory content. My question is why somwehere between kernel 3.14 and 4.9 pci device naming has changed? For both kernels we have same hardware, dtb device tree and everything else common.
I would assume that there are other PCI devices on your system. If indeed so, do you see difference with other PCI devices in context of output of lspci between these two kernels ?
Rami Rosen
Re-doing my comment as an answer, since their was no response to my comment. The question is why the reported domain parts of the PCI Ids which were 0 and 1 with Linux 3.19 are 0x9000 and 0xa000 with Linux 4.9. Commit 63a72284 in Linux 4.7 changes the values assigned to domains to be predictable values based on the device tree information instead of consecutive numbers starting at 0. I think it is a safe assumption that this commit is the reason for the change.
So I am trying to get information on graphics cards via WinAPI functions, but have a question regarding how to get my exact card information. I have written code to call EnumDisplayDevices and through my call I receive back the DeviceString "Intel(R) HD Graphics Family". However this is not telling me the exact card, for example the Intel HD Graphics Family has a 4200, 4400, so on (from my understanding).
I searched around more for ways to find this information, even looking through the registry which still led me to a description string of "Intel(R) HD Graphics Family"... Now I am here. Thanks alot to anybody who can help me out, it was infact a stackoverflow thread which led me in the direction of EnumDisplayDevices in the first place :)
I would use OpenGL instead WinAPI for this because I do not know if WinAPI even has some feature like this and too lazy to research. Yes you can search registry keys for this info but that is not safe in the future due to possible location/name change. The OpenGL way is straight forward:
create OpenGL rendering context
obtain the appropriate vendor and device strings.
release OpenGL rendering context
It will work for any OpenGL capable graphic card/driver supporting OpenGL 1.0 which are all of the nowadays cards.
see: C++ example of OpenGL context initialization
or: complete GL+VAO/VBO+GLSL+shaders example in C++
You can use OpenGL function glGetString to obtain this info:
GL_VENDOR Returns the company responsible for this OpenGL implementation. This name does not change from release to release.
GL_RENDERER Returns the name of the renderer. This name is typically specific to a particular configuration of a hardware platform. It does not change from release to release.
GL_VERSION Returns a version or release number (of supported OpenGL and gfx driver version)
GL_EXTENSIONS Returns a space-separated list of supported extensions to OpenGL (all capabilities of your card)
The rest is easy (using gl_init,gl_exit from second link):
gl_init(Your_App_Window_Handle);
char *vendor =(char*)glGetString(GL_VENDOR);
char *device =(char*)glGetString(GL_RENDERER);
char *version=(char*)glGetString(GL_VERSION);
char *ext =(char*)glGetString(GL_EXTENSIONS);
gl_exit();
Mine setup returns:
vendor ="NVIDIA Corporation"
device ="GeForce GTX 550 Ti/PCIe/SSE2"
version="4.5.0 NVIDIA 347.25"
ext ="GL_AMD_multi_draw_indirect GL_ARB_arrays_of_arrays GL_ARB_base_instance GL_ARB_blend_func_extended GL_ARB_buffer_storage GL_ARB_clear_buffer_object GL_ARB_clear_texture GL_ARB_clip_control GL_ARB_color_buffer_float GL_ARB_compatibility GL_ARB_compressed_texture_pixel_storage GL_ARB_conservative_depth GL_ARB_compute_shader GL_ARB_compute_variable_group_size GL_ARB_conditional_render_inverted GL_ARB_copy_buffer GL_ARB_copy_image GL_ARB_cull_distance GL_ARB_debug_output GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_derivative_control GL_ARB_direct_state_access GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_indirect GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_enhanced_layouts GL_ARB_ES2_compatibility GL_ARB_ES3_compatibility GL_ARB_ES3_1_compatibility GL_ARB_explicit_attrib_location GL_ARB_explicit_uniform_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_layer_viewport GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_no_attachments GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_get_program_binary GL_ARB_get_texture_sub_image GL_ARB_gpu_shader5 GL_ARB_gpu_shader_fp64 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_indirect_parameters GL_ARB_instanced_arrays GL_ARB_internalformat_query GL_ARB_internalformat_query2 GL_NV_internalformat_sample_query GL_ARB_invalidate_subdata GL_ARB_map_buffer_alignment GL_ARB_map_buffer_range GL_ARB_multi_bind GL_ARB_multi_draw_indirect GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pipeline_statistics_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_program_interface_query GL_ARB_provoking_vertex GL_ARB_robust_buffer_access_behavior GL_ARB_robustness GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_separate_shader_objects GL_ARB_shader_atomic_counters GL_ARB_shader_bit_encoding GL_ARB_shader_draw_parameters GL
[Notes]
you need to include only gl.h for this no need for glu,glew or anything else (except wglext.h which should be included on its own inside gl.h). It is usually located in separate include subdirectory like:
#include <gl\gl.h>
[Edit1]
As Intel OpenGL implementation does not expose the version too I see only one other option. You need to acquire PCI ID VID/PID of the card and cross check against known values:
Model CPU arch. Release date PCI ID Execution units
HD Graphics Arrandale 2010 8086:0046 6
HD Graphics Sandy Bridge January 2011 8086:0106 6
HD Graphics 2000 Sandy Bridge January 2011 8086:0102 6
HD Graphics 3000 Sandy Bridge January 2011 8086:0116 16
HD Graphics 2500 Ivy Bridge April 2012 8086:016A 6
HD Graphics 4000 Ivy Bridge April 2012 8086:0166 16
HD Graphics 4400 Haswell 2013 20
HD Graphics 4600 Haswell 2013 8086:0416 20
HD Graphics 5500 Broadwell 2015 24
taken from here.
To obtain the PCI ID you can use this:
my setupapi.h C++ example
Just change the parsing string from TEXT("USB") to TEXT("PCI") and check VID 8086 devices so:
bool PCIinfo()
{
int i,n;
AnsiString s,txt="";
DWORD dwSize,dwPropertyRegDataType;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
TCHAR szDesc[1024];
// hDevInfo = SetupDiGetClassDevs(NULL, NULL , NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); // List all devices
// hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); // List all connected USB devices
hDevInfo = SetupDiGetClassDevs(NULL, TEXT("PCI"), NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); // List all connected PCI devices
if (hDevInfo == INVALID_HANDLE_VALUE) return false;
// Find the ones that are driverless
for (i=0;;i++)
{
DeviceInfoData.cbSize = sizeof(DeviceInfoData);
if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)) break;
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
s=szDesc; n=48; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
s=szDesc; n=64; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_LOCATION_INFORMATION,&dwPropertyRegDataType, (BYTE*)szDesc,sizeof(szDesc),&dwSize);
s=szDesc; n=40; while (s.Length()<n) s+=" "; if (s.Length()>n) s=s.SubString(1,n); txt+=s+" ";
txt+="\r\n";
}
Main->mm_log->Lines->Add(txt);
return true;
}
that code returns on my setup this:
PCI standard host CPU bridge PCI\VEN_1022&DEV_1400&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 0
PCI standard host CPU bridge PCI\VEN_1022&DEV_1401&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 1
PCI standard host CPU bridge PCI\VEN_1022&DEV_1402&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 2
PCI standard host CPU bridge PCI\VEN_1022&DEV_1403&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 3
PCI standard host CPU bridge PCI\VEN_1022&DEV_1404&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 4
PCI standard host CPU bridge PCI\VEN_1022&DEV_1405&SUBSYS_00000000&REV_00 PCI bus 0, device 24, function 5
PCI standard host CPU bridge PCI\VEN_1022&DEV_1410&SUBSYS_14101022&REV_00 PCI bus 0, device 0, function 0
PCI Express standard Root Port PCI\VEN_1022&DEV_1412&SUBSYS_12341022&REV_00 PCI bus 0, device 2, function 0
PCI Express standard Root Port PCI\VEN_1022&DEV_1414&SUBSYS_12341022&REV_00 PCI bus 0, device 4, function 0
PCI Express standard Root Port PCI\VEN_1022&DEV_1417&SUBSYS_12341022&REV_00 PCI bus 0, device 7, function 0
AMD IOMMU Device PCI\VEN_1022&DEV_1419&SUBSYS_14191022&REV_00 PCI bus 0, device 0, function 2
AMD SATA Controller PCI\VEN_1022&DEV_7801&SUBSYS_B0021458&REV_40 PCI bus 0, device 17, function 0
Standard OpenHCD USB Host Controller PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11 PCI bus 0, device 18, function 0
Standard OpenHCD USB Host Controller PCI\VEN_1022&DEV_7807&SUBSYS_50041458&REV_11 PCI bus 0, device 19, function 0
Standard Enhanced PCI to USB Host Controller PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11 PCI bus 0, device 18, function 2
Standard Enhanced PCI to USB Host Controller PCI\VEN_1022&DEV_7808&SUBSYS_50041458&REV_11 PCI bus 0, device 19, function 2
Standard OpenHCD USB Host Controller PCI\VEN_1022&DEV_7809&SUBSYS_50041458&REV_11 PCI bus 0, device 20, function 5
AMD SMBus PCI\VEN_1022&DEV_780B&SUBSYS_780B1022&REV_14 PCI bus 0, device 20, function 0
High Definition Audio Controller PCI\VEN_1022&DEV_780D&SUBSYS_A0021458&REV_01 PCI bus 0, device 20, function 2
PCI standard ISA bridge PCI\VEN_1022&DEV_780E&SUBSYS_780E1022&REV_11 PCI bus 0, device 20, function 3
PCI standard PCI-to-PCI bridge PCI\VEN_1022&DEV_780F&SUBSYS_00000000&REV_40 PCI bus 0, device 20, function 4
AMD USB 3.0 Host Controller PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03 PCI bus 0, device 16, function 0
AMD USB 3.0 Host Controller PCI\VEN_1022&DEV_7812&SUBSYS_50041458&REV_03 PCI bus 0, device 16, function 1
High Definition Audio Controller PCI\VEN_10DE&DEV_0BEE&SUBSYS_35371458&REV_A1 PCI bus 1, device 0, function 1
NVIDIA GeForce GTX 550 Ti PCI\VEN_10DE&DEV_1244&SUBSYS_35371458&REV_A1 PCI bus 1, device 0, function 0
Realtek PCIe GBE Family Controller PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_06 PCI bus 2, device 0, function 0
MSI TV#Anywhere Plus PCI\VEN_1131&DEV_7133&SUBSYS_62311462&REV_D1 PCI bus 4, device 6, function 0
Etron USB 3.0 Extensible Host Controller PCI\VEN_1B6F&DEV_7023&SUBSYS_50071458&REV_01 PCI bus 3, device 0, function 0
so run it on different IntelHD graphics computers and check if different PCI ID is there ...
The primary problem with "driver version" is that video driver consists of multiple components which might be marker differently and the versions you obtain via different APIs might also vary.
Perhaps straightforward way is to use SetupDiGetClassDevs(&GUID_DEVCLASS_DISPLAY, ... API and enumerate the items. This is going to give you the data close to what you see in device manager, with versions - DEVPKEY_Device_DriverVersion obtained with SetupDiGetDeviceRegistryProperty value specifically.
If you run this utility, if includes a section "Display Devices" with enumeration as mentioned, and it does mention driver version:
Display Devices
Intel(R) HD Graphics 4600
Instance: PCI\VEN_8086&DEV_0412&SUBSYS_85341043&REV_06\3&11583659&0&10
DEVPKEY_Device_Manufacturer: Intel Corporation
DEVPKEY_Device_DriverVersion: 20.19.15.4835 <<-----------------------
NVIDIA GeForce GTX 750
Instance: PCI\VEN_10DE&DEV_1381&SUBSYS_288B19DA&REV_A2\4&3834D97&0&0008
DEVPKEY_Device_Manufacturer: NVIDIA
DEVPKEY_Device_DriverVersion: 23.21.13.8813
I'm trying to configure the programmable logic inside the parallella board (based on zynq 7020), I insert an sd card that contains bitstream, fsbl.elf and hello_world.elf after the board is booted I tried to do this
zynq-uboot> fatload mmc 0 0x4000000 design_1_wrapper.bit
reading design_1_wrapper.bit
4045678 bytes read
zynq-uboot> fpga loadb 0 0x4000000 4045678
design filename = "design_1_wrapper;UserID=0XFFFFFFFF;Version=2014.3.1"
part number = "7z020clg400"
date = "2015/09/30"
time = "10:58:34"
bytes in bitstream = 4045564
Error: Timeout waiting for FPGA to config.
fpga - loadable FPGA image support
Usage:
fpga [operation type] [device number] [image address] [image size]
fpga operations:
dump [dev] Load device to memory buffer
info [dev] list known device information
load [dev] [address] [size] Load device from memory buffer
loadb [dev] [address] [size] Load device from bitstream buffer (Xilinx only)
loadmk [dev] [address] Load device generated with mkimage
For loadmk operating on FIT format uImage address must include
subimage unit name in the form of addr:<subimg_uname>
zynq-uboot> fpga info 0
Xilinx Device
Descriptor # 0x3dfb8b84
Family: Zynq PL
Interface type: Device configuration interface (Zynq)
Device Size: 4045564 bytes
Cookie: 0x0 (0)
No Device Function Table.
zynq-uboot>
why the PL is not configured? Is it the size?
Thank you