123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- Spear PCIe Gadget Driver:
- Author
- =============
- Pratyush Anand (pratyush.anand@gmail.com)
- Location
- ============
- driver/misc/spear13xx_pcie_gadget.c
- Supported Chip:
- ===================
- SPEAr1300
- SPEAr1310
- Menuconfig option:
- ==========================
- Device Drivers
- Misc devices
- PCIe gadget support for SPEAr13XX platform
- purpose
- ===========
- This driver has several nodes which can be read/written by configfs interface.
- Its main purpose is to configure selected dual mode PCIe controller as device
- and then program its various registers to configure it as a particular device
- type. This driver can be used to show spear's PCIe device capability.
- Description of different nodes:
- =================================
- read behavior of nodes:
- ------------------------------
- link :gives ltssm status.
- int_type :type of supported interrupt
- no_of_msi :zero if MSI is not enabled by host. A positive value is the
- number of MSI vector granted.
- vendor_id :returns programmed vendor id (hex)
- device_id :returns programmed device id(hex)
- bar0_size: :returns size of bar0 in hex.
- bar0_address :returns address of bar0 mapped area in hex.
- bar0_rw_offset :returns offset of bar0 for which bar0_data will return value.
- bar0_data :returns data at bar0_rw_offset.
- write behavior of nodes:
- ------------------------------
- link :write UP to enable ltsmm DOWN to disable
- int_type :write interrupt type to be configured and (int_type could be
- INTA, MSI or NO_INT). Select MSI only when you have programmed
- no_of_msi node.
- no_of_msi :number of MSI vector needed.
- inta :write 1 to assert INTA and 0 to de-assert.
- send_msi :write MSI vector to be sent.
- vendor_id :write vendor id(hex) to be programmed.
- device_id :write device id(hex) to be programmed.
- bar0_size :write size of bar0 in hex. default bar0 size is 1000 (hex)
- bytes.
- bar0_address :write address of bar0 mapped area in hex. (default mapping of
- bar0 is SYSRAM1(E0800000). Always program bar size before bar
- address. Kernel might modify bar size and address for alignment, so
- read back bar size and address after writing to cross check.
- bar0_rw_offset :write offset of bar0 for which bar0_data will write value.
- bar0_data :write data to be written at bar0_rw_offset.
- Node programming example
- ===========================
- Program all PCIe registers in such a way that when this device is connected
- to the PCIe host, then host sees this device as 1MB RAM.
- #mount -t configfs none /Config
- For nth PCIe Device Controller
- # cd /config/pcie_gadget.n/
- Now you have all the nodes in this directory.
- program vendor id as 0x104a
- # echo 104A >> vendor_id
- program device id as 0xCD80
- # echo CD80 >> device_id
- program BAR0 size as 1MB
- # echo 100000 >> bar0_size
- check for programmed bar0 size
- # cat bar0_size
- Program BAR0 Address as DDR (0x2100000). This is the physical address of
- memory, which is to be made visible to PCIe host. Similarly any other peripheral
- can also be made visible to PCIe host. E.g., if you program base address of UART
- as BAR0 address then when this device will be connected to a host, it will be
- visible as UART.
- # echo 2100000 >> bar0_address
- program interrupt type : INTA
- # echo INTA >> int_type
- go for link up now.
- # echo UP >> link
- It will have to be insured that, once link up is done on gadget, then only host
- is initialized and start to search PCIe devices on its port.
- /*wait till link is up*/
- # cat link
- wait till it returns UP.
- To assert INTA
- # echo 1 >> inta
- To de-assert INTA
- # echo 0 >> inta
- if MSI is to be used as interrupt, program no of msi vector needed (say4)
- # echo 4 >> no_of_msi
- select MSI as interrupt type
- # echo MSI >> int_type
- go for link up now
- # echo UP >> link
- wait till link is up
- # cat link
- An application can repetitively read this node till link is found UP. It can
- sleep between two read.
- wait till msi is enabled
- # cat no_of_msi
- Should return 4 (number of requested MSI vector)
- to send msi vector 2
- # echo 2 >> send_msi
- #cd -
|