Linux v6.6 · 개념과 코드 읽기

플랫폼 드라이버: 장치와 구현이 만나는 매칭 순서

이 코드는 어떤 문제를 푸나요?

SoC 내부 장치는 PCI처럼 하드웨어 스스로 모든 정보를 알려주지 못하는 경우가 많습니다. platform 장치 모델은 Device Tree·ACPI·보드 정보 등으로 만들어진 장치를 드라이버와 연결합니다. platform_match 전체는 override, OF, ACPI, id 표와 이름 비교가 어떤 순서로 적용되는지 보여 줍니다. 매칭 결과는 probe를 시도할 근거이지 자원 설정 성공의 증거는 아닙니다.

읽을 범위: v6.6 · drivers/base/platform.c · platform_match 1335–1358행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.

먼저 알아둘 개념

platform_device

메모리 주소 범위·IRQ 등 장치 인스턴스의 자원을 나타내는 platform 쪽 구조체입니다. 공통 device를 내부에 포함합니다.

platform_driver

platform 장치를 다룰 probe와 매칭 정보를 담는 구현입니다. 공통 device_driver를 포함하므로 공통 버스 계층에서 함께 다룰 수 있습니다.

driver_override

이 v6.6 구현은 platform_device에 저장된 override 문자열을 드라이버 이름과 직접 비교합니다. 문자열이 있으면 일반 OF·ACPI 매칭보다 그 결과를 우선합니다.

probe와 자원

매칭 뒤 probe에서 MMIO·IRQ·클록·전원 등을 얻고 장치를 준비합니다. 자원이 아직 없으면 지연된 probe가 필요할 수 있습니다.

처음 읽을 때

Device Tree가 있는 보드의 전형적 흐름과 이름으로만 연결하는 오래된 흐름을 구분하십시오. 이 함수는 가능한 방법을 순서대로 시도하되 앞에서 결정되면 뒤를 실행하지 않습니다.

더 깊이 살펴볼 때

id_table이 존재하지만 일치하지 않는 경우에는 거짓을 바로 반환하므로 마지막 이름 비교로 내려가지 않습니다. override도 문자열이 있으면 일치 여부를 즉시 반환합니다. v6.6은 공통 override 도우미의 정수 결과 대신 문자열 포인터를 직접 검사합니다.

그림으로 보는 변화

플랫폼 드라이버: 장치와 구현이 만나는 매칭 순서의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. 공통 객체를 해석합니다

device와 device_driver에서 platform 전용 정보를 얻고 override를 검사합니다.

화살표는 포함 관계를 이용한 구조체 포인터 변환입니다.

2. 펌웨어 정보로 맞춥니다

OF 매칭을 먼저 보고 실패하면 ACPI 매칭을 시도합니다.

화살표는 후보 검사 순서이며 probe 호출 자체가 아닙니다.

3. id 표 또는 이름으로 판단합니다

id 표가 있으면 그 결과로 끝내고, 표가 없을 때만 이름 비교를 사용합니다.

갈라지는 화살표는 서로 다른 최종 판정 경로입니다.

platform_match를 한 줄씩 읽기

줄 번호는 v6.6 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.

static int platform_match(struct device *dev, struct device_driver *drv)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_driver *pdrv = to_platform_driver(drv);

	/* When driver_override is set, only bind to the matching driver */
	if (pdev->driver_override)
		return !strcmp(pdev->driver_override, drv->name);

	/* Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))
		return 1;

	/* Then try ACPI style match */
	if (acpi_driver_match_device(dev, drv))
		return 1;

	/* Then try to match against the id table */
	if (pdrv->id_table)
		return platform_match_id(pdrv->id_table, pdev) != NULL;

	/* fall-back to driver name match */
	return (strcmp(pdev->name, drv->name) == 0);
}
static int platform_match(struct device *dev, struct device_driver *drv)

공통 장치와 드라이버가 platform 규칙에 따라 맞는지 판정합니다. v6.6 선언의 드라이버 포인터는 const로 한정되어 있지 않습니다.

	struct platform_device *pdev = to_platform_device(dev);

포함된 공통 device를 바탕으로 이를 감싼 platform_device를 얻습니다. 새 장치를 만드는 할당은 아닙니다.

	struct platform_driver *pdrv = to_platform_driver(drv);

공통 device_driver에서 platform_driver를 얻어 id 표 등을 볼 수 있게 합니다.

	if (pdev->driver_override)

platform 장치에 특정 드라이버 이름을 지정하는 override 문자열이 있는지 확인합니다.

		return !strcmp(pdev->driver_override, drv->name);

override 문자열과 드라이버 이름이 완전히 같은지 strcmp로 비교해 바로 반환합니다. override가 있으면 불일치해도 일반 매칭으로 내려가지 않습니다.

	if (of_driver_match_device(dev, drv))

Device Tree의 호환성 정보로 이 장치와 드라이버가 맞는지 검사합니다.

		return 1;

OF 정보가 맞으면 일치값 1을 반환합니다.

	if (acpi_driver_match_device(dev, drv))

OF에서 결정되지 않았으면 ACPI 방식의 매칭을 시도합니다.

		return 1;

ACPI 정보가 맞으면 일치값을 반환합니다.

	if (pdrv->id_table)

드라이버가 platform id 표를 제공하는지 확인합니다.

		return platform_match_id(pdrv->id_table, pdev) != NULL;

id 표에 장치 이름이 있으면 참, 없으면 거짓을 바로 반환합니다. 표가 있는 경우 여기서 판정이 끝납니다.

	return (strcmp(pdev->name, drv->name) == 0);

별도 id 표도 없을 때 장치와 드라이버 이름의 완전 일치를 마지막 기준으로 사용합니다. strcmp의 0을 참으로 바꾸어 반환합니다.

함께 생각해 볼 질문

id 표가 있는데 안 맞으면 드라이버 이름도 비교하나요?

이 코드에서는 id 표의 일치 여부를 바로 반환하므로 이름 비교로 내려가지 않습니다.

매칭이 1이면 IRQ를 이미 요청했나요?

아닙니다. 장치와 드라이버가 맞는다는 판정이며 자원 획득은 probe 등의 후속 단계입니다.

to_platform_device는 새 객체를 할당하나요?

아닙니다. 내부에 포함된 공통 device에서 이를 감싸는 platform_device를 찾아 포인터를 변환합니다.

출처와 읽은 범위

Linux stable v6.6 · drivers/base/platform.c

해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고

맨 위로 ↑