2014-02-19 4 views
1

현재 PCI 장치에 2 개의 벡터가있는 MSI를 지원해야합니다. 각 벡터에는 다른 처리 루틴이 있어야합니다. HW 문서는 다음다른 IRQ 처리기로 PCI 드라이버에서 다중 MSI 활성화

벡터 0 벡터 1 파워 센서 아래

입니다

난 다음입니다 드라이버 코드 온도 센서 말한다. 1. 먼저 pci_enable_msi_block (pdev, 2)을 사용하여 두 벡터를 활성화하십시오. 2. request_irq (두 개의 다른 irq, 두 개의 diff 인터럽트 핸들러)를 사용하여 인터럽트 핸들러를 할당하십시오.

int vecs = 2; 
struct pci_dev *pdev = dev->pci_dev; 
result = pci_enable_msi_block(pdev, vecs); 

여기서 두 개의 벡터를 활성화 할 때 호출이 성공했다고하는 결과는 0입니다. 내가이

질문은 다음과 같습니다

  1. HW 문서 벡터 0, 난이 잘 OS의 벡터 0이 아닌 희망을 말한다? 어떤 경우에는 OS에서 벡터 0을 얻을 수 없습니다.
  2. 내가 직면하는 어려운 문제는 첫 번째 irq에 대한 request_irq()를 수행 할 때 운영체제에이 요청을 벡터 0의 하드웨어에 매핑하는 방법은 무엇입니까? 연속적으로 두 번째 irq에 대해, 어떻게 HW 벡터 1 벡터를 매핑합니까?

답변

0

MSI와 MSI-X의 경우 인터럽트 번호 (irq)는 CPU "벡터"입니다. 메시지 신호 인터럽트를 사용하면 장치가 특수 메모리 매핑 I/O 주소에 적은 양의 데이터를 쓸 수 있습니다. 칩셋은 해당 인터럽트를 프로세서에 전달합니다.

MSI 주소에 쓸 수있는 두 개의 다른 MSI 인터럽트 데이터가있을 수 있습니다. 하드웨어와 마찬가지로 2 개의 MSI (온도 센서 용 및 전력 센서 용)가 지원됩니다. 따라서 pci_enable_msi_block(pdev, 2);을 실행하면 두 개의 MSI 데이터 중 하나가 해당 특수 메모리 매핑 I/O 주소 (MSI 주소)에 기록 될 때마다 칩셋이 프로세서에 인터럽트를 발생시킵니다. pci_enable_msi_block(pdev, 2);으로 전화 한 후 request_irq(pdev->irq, handler, flags....)request_irq(pdev->irq + 1, handler, flags....)을 통해 두 개의 irq를 요청할 수 있습니다. 따라서 MSI 주소에 MSI 데이터가 기록 될 때마다 MSI를 보낸 센서에 따라 pdev->irq 또는 pdev->irq + 1이 어서 트되고 해당 처리기가 호출됩니다.

이 두 MSI 데이터는 하드웨어의 MSI 데이터 레지스터로 구성 할 수 있습니다.

2

pci_enable_msi_block :

2 MSI 메시지이 함수 및 함수 호출 0을 반환하는 경우, 다음 2 MSI 메시지가 장치에 할당되어 pdev->irq 장치에 할당 된 인터럽트 최저로 갱신을 사용하여 요청한다면 .

그래서 pdev->irqpdev->irq+1은 장치에 할당 된 새로운 인터럽트입니다. 이제 두 개의 인터럽트 핸들러를 등록 할 수 있습니다.

request_irq(pdev->irq, handler1, ...) 
request_irq(pdev->irq+1, handler2, ...)