use of dev->dev_t

Malte Vesper malte.vesper at postgrad.manchester.ac.uk
Tue Mar 17 18:25:40 EDT 2015



On 17/03/15 21:53, Greg KH wrote:
> On Tue, Mar 17, 2015 at 09:46:13PM +0000, Malte Vesper wrote:
>>
>> On 17/03/15 21:13, Greg KH wrote:
>>> On Tue, Mar 17, 2015 at 08:43:38PM +0000, Malte Vesper wrote:
>>>> Hi,
>>>> I am trying to write a driver that uses the MINOR(dev_t) to identify
>>>> cards. Since it is a PCI driver and I get pcidev->dev.dev_t anyway. I
>>>> thought about not bothering to store the minor number of the device.
>>>> However if I look at pcidev->dev.dev_t in the remove function (the
>>>> driver frameworks remove), I always get pcidev->dev.dev_t == 0.
>>> That dev_t is not for your use, sorry, it is for the driver core to use,
>>> if it needs/wants to for a class device.  A PCI driver should never need
>>> to be a char device, but if it does, you have to make your own calls to
>>> the character device core.
>>>
>>> What type of PCI device is this?  Why do you want to have a character
>>> device node for it?
>>>
>>> thanks,
>>>
>>> greg k-h
>> I want to do stream processing with a FPGA. I hoped that I could read the
>> minor from that field after calling device_create().
> Yes, you can, but that's not what your pci device uses, you have to
> create your own device to be able to use that.  And your driver should
> never need/care about what the minor number really is if you write it
> correctly :)
I only care about the minor to call device_destroy.
Also I thought it would be a nice way to ID the actual instance of the 
device (I want to support multiple FPGAs, and figured I get the minor 
from IOCTL calls for free).
If there is a driver that has a good way of doing it a pointer would 
help so I could look at the code.
>
>> As for the streaming bit the intended mode of operation is send a chunk,
>> receive a processed chunk. Since the FPGA might do filtering the result
>> might be smaller.
>> Also there is no random access, and once a bit of the returned data has been
>> read, it can not be read again. The FPGA is more or less passthrough with
>> some FIFO buffers.
> Then why not just use the firmware interface for this instead?
>
>> This use model and other examples (there are a few PCIe FPGA drivers out
>> there which do char device (i.e. Riffa)), led me to pick a char device.
>> Either way, the actual data transfer is handled solely by the device acting
>> as a bus master (DMA).
>>
>> Would you still recommend a block device driver type?
> Firmware :)
 From a quick google glance and my understanding of firmware I 
understand the firmware interface as "Load this program on the devices 
microcontroller".
The usage model I envision is more like: FPGA implements filter: Returns 
all entries from a list which have a key greater threshold. So I need to 
tell the driver 1) get list from memory here 2) put result in memory at 
location 2.
If firmware is still better and I missunderstand it I will further read 
up on it. (That would be one of the cases where one needs to know which 
parts of the fine "manual" are relevant)
>
>> Is there an elegant way to get back at the MINOR() without storing it i.e.
>> in the private data field (pci_set_drvdata).
> Why do you need to know the minor?  And again, please keep your pci
> device separate from anything that you try to create.  You don't own the
> lifecycle of the pci device, the pci core does.
I feel I fail to grasp the meaning of this with my limited insight. I 
figured that the PCI core would ensure that remove is called (after all 
I suppy it a struct pci_driver, so that I can define the add/remove work 
needed). Why is it wrong to try (well it does not work, but I can't 
quite see why it should be 0 after calling device_create succesfully):

static void remove(struct pci_dev *pcidev) {
     ...
     device_destroy(FPCI3.class, pcidev->dev.devt);
     ...
}

I understand (from your earlier mail) that the pci framework does not 
touch pcidev->dev.devt, since it uses its own identifier.
>
> Also, there's a long-standing discussion of a "real" fpga kernel
> interface on the linux-kernel mailing list.  I suggest reading the
> archives for it, and joining if you want to help create something that
> works for your card.
I will have a look. Thanks for the pointer and insights,
Malte
>
> thanks,
>
> greg k-h




More information about the Kernelnewbies mailing list