Что такое шина 0 устройство 0 функция 0

Архитектура ЭВМ

Компоненты ПК

Интерфейсы

Мини блог

Самое читаемое

http://foraconsult.ru/ составление и подготовка налоговой отчетности. Реклама в сми и интернет в петровске.

PCI и PCI-X

Шины, устройства, функции и хост

Каждое устройство PCI при установке в конкретную систему получает идентификатор, однозначно определяющий его положение на «дереве» шин PCI данного компьютера. Идентификатор имеет иерархическую структуру и состоит из номера шины (bus), номера устройства (device) и номера функции (function). Идентификатор задает положение блока конфигурационных регистров заданной функции выбранного устройства в общем конфигурационном пространстве данной системы. Идентификаторы фигурируют при обращениях к регистрам конфигурационного пространства, а также при обмене сообщениями между устройствами.

Шина PCI представляет собой набор сигнальных линий, непосредственно соединяющих интерфейсные выводы группы устройств (слотов, микросхем на плате). В системе может присутствовать несколько шин PCI, соединенных мостами PCI. Мосты электрически отделяют интерфейсные сигналы одной шины от другой, соединяя шины логически; главный мост соединяет главную шину PCI с хостом (процессором и памятью). Каждая шина имеет свой номер шины (PCI bus number). Шины нумеруются последовательно, начиная от хоста; шина PCI, подключенная к главному мосту, имеет нулевой номер.

Устройством PCI называется микросхема или карта расширения, подключенная к одной из шин PCI и использующая для доступа к конфигурационным регистрам выделенную ей линию IDSEL, принадлежащую этой шине. Устройство может быть многофункциональным, то есть состоять из множества (от 1 до 8) так называемых функций. Каждой функции отводится конфигурационное пространство в 256 байт, в PCI-X оно расширено до 4096 байт. Многофункциональные устройства должны отзываться только на конфигурационные циклы с номерами функций, для которых имеется конфигурационное пространство. При этом функция с номером 0 должна присутствовать обязательно (по результатам обращения к ней определяется присутствие устройства), номера остальных функций назначаются разработчиком устройства произвольно (в диапазоне 1–7). Простые (однофункциональные) устройства, в зависимости от реализации, могут отзываться либо на любой номер функций, либо только на номер функции 0.

Нумерацией и конфигурированием всех устройств PCI занимается хост — «хозяин» шины PCI. Роль хоста, как правило, выполняет центральный процессор, связанный с шиной PCI главным мостом, от которого и начинается нумерация шин. Конфигурирование всех устройств шины возможно только со стороны хоста — в этом заключается его особая роль. Ни с одной из шин PCI ни один задатчик не имеет доступа к конфигурационным регистрам всех устройств PCI, без чего полное конфигурирование недоступно. Даже с нулевой шины PCI задатчику недоступны конфигурационные регистры главного моста, а без доступа к ним невозможно запрограммировать распределение адресов между хостом и устройствами PCI. С других шин PCI возможности доступа к конфигурационным регистрам еще скромнее.

Конфигурирование выполняется для каждой функции; полный идентификатор функции состоит из трех частей: номера шины, номера устройства и номера функции. Короткая форма идентификатора вида PCI0:1:2 (например, в сообщениях ОС Unix) означает функцию 2 устройства 1, подключенного к главной (0) шине PCI. Диспетчер устройств (конфигурационное ПО) должен оперировать списком всех функций всех устройств, обнаруженных на всех шинах PCI данной системы (компьютера).

В шине PCI принята географическая нумерация — номер устройства определяется местом его подключения. Номер устройства (device number или dev) определя-ется той линией шины AD, к которой подключена его линия сигнала IDSEL. В соседних слотах PCI, как правило, задействуются соседние номера устройств; их нумерация определяется разработчиком системной платы (или пассивной кросс-платы в промышленных компьютерах). Часто для слотов используются убывающие номера устройств, начиная с 20 или 15. Группы соседних слотов могут подключаться к разным шинам; на каждой шине PCI нумерация устройств независимая (могут быть и устройства с совпадающими номерами dev, но разными номерами шин). Устройства PCI, интегрированные в системную плату, используют ту же систему нумерации. Их номера «запаяны намертво», в то время как номера устройств на картах расширения можно изменять, переставляя их в разные слоты.

Одна карта PCI может содержать только одно устройство шины, к которой она подключается, поскольку ей в слоте выделяется только одна линия IDSEL. Если на карте размещают несколько устройств (например, 4-портовая карта Ethernet), то на ней приходится устанавливать мост — устройство PCI, к которому и обращаются по линии IDSEL, выделенной данной карте. Этот мост организует на карте дополнительную шину PCI, к которой можно подключить множество устройств. Каждое из этих устройств получит свою линию IDSEL, но относящуюся уже к дополнительной шине PCI данной карты.

С точки зрения обращения к пространствам памяти и ввода/вывода географический адрес (номер шины и номер устройства) в пределах одной шины безразличен. Однако номер устройства определяет номер линии запроса прерывания, которой может пользоваться устройство. Подробнее об этом рассказывается в главе 3, здесь же отметим, что на одной шине устройства с номерами, отличающимися друг от друга на 4, будут использовать одну и ту же линию прерывания. В системах с несколькими шинами PCI перестановка устройства в слоты разных шин может влиять на производительность, что связано с характеристиками данной шины и ее удаленностью от главного моста.

Разобраться с нумерацией устройств и полученных ими линий прерываний на конкретной плате можно, если устанавливать карту PCI поочередно в каждый из слотов (отключая питание) и смотреть на сообщения об обнаруженных устройствах PCI, выводимых на дисплей в конце теста POST. В этих сообщениях будут фигурировать и устройства PCI, установленные непосредственно на системной плате (не отключенные параметрами CMOS Setup). Но чтобы не возникло иллюзии простоты, отметим, что «особо умные» операционные системы (например, Windows) не довольствуются полученными назначениями номеров прерываний и изменяют их по своему усмотрению.

Источник

Работа видеоадаптера с Windows 10

После установки 10-ки перестала работать видеокарта AMD (дополнительная). На сайте производителя ноутбука(HP) нет драйверов для 10-ки. Позже появился на сайте AMD. Установился нормально (ошибок не выдавал). Но, тем не менее, нужное мне приложение не видит этой видеокарты и работает со встроенной от «Intel». В свойствах видеоадаптера (встроенного) пишется так: «PCI-шина 0, устройство 2, функция 0», а в свойствах нужной мне карты так: «PCI-шина 1, устройство 0, функция 0». Может подскажет кто-нибудь, что нужно сделать?

Ответы (6) 

После установки 10-ки перестала работать видеокарта AMD (дополнительная). На сайте производителя ноутбука(HP) нет драйверов для 10-ки. Позже появился на сайте AMD. Установился нормально (ошибок не выдавал). Но, тем не менее, нужное мне приложение не видит этой видеокарты и работает со встроенной от «Intel». В свойствах видеоадаптера (встроенного) пишется так: «PCI-шина 0, устройство 2, функция 0», а в свойствах нужной мне карты так: «PCI-шина 1, устройство 0, функция 0». Может подскажет кто-нибудь, что нужно сделать?

Читайте также:  У какого авто самый надежный акпп

Был ли этот ответ полезным?

К сожалению, это не помогло.

Отлично! Благодарим за отзыв.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв, он поможет улучшить наш сайт.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв.

После установки 10-ки перестала работать видеокарта AMD (дополнительная). На сайте производителя ноутбука(HP) нет драйверов для 10-ки. Позже появился на сайте AMD. Установился нормально (ошибок не выдавал). Но, тем не менее, нужное мне приложение не видит этой видеокарты и работает со встроенной от «Intel». В свойствах видеоадаптера (встроенного) пишется так: «PCI-шина 0, устройство 2, функция 0», а в свойствах нужной мне карты так: «PCI-шина 1, устройство 0, функция 0». Может подскажет кто-нибудь, что нужно сделать?

Был ли этот ответ полезным?

К сожалению, это не помогло.

Отлично! Благодарим за отзыв.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв, он поможет улучшить наш сайт.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв.

После установки 10-ки перестала работать видеокарта AMD (дополнительная). На сайте производителя ноутбука(HP) нет драйверов для 10-ки. Позже появился на сайте AMD. Установился нормально (ошибок не выдавал). Но, тем не менее, нужное мне приложение не видит этой видеокарты и работает со встроенной от «Intel». В свойствах видеоадаптера (встроенного) пишется так: «PCI-шина 0, устройство 2, функция 0», а в свойствах нужной мне карты так: «PCI-шина 1, устройство 0, функция 0». Может подскажет кто-нибудь, что нужно сделать?

так ведь дело не в гарантии, а в возможности. Если существует способ проверить, хотелось бы использовать. Не хочется возвращаться к чему-то старому, если есть новое.

Тогда Вы испытываете эти «возможности» на свой риск.

Был ли этот ответ полезным?

К сожалению, это не помогло.

Отлично! Благодарим за отзыв.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв, он поможет улучшить наш сайт.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв.

Был ли этот ответ полезным?

К сожалению, это не помогло.

Отлично! Благодарим за отзыв.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв, он поможет улучшить наш сайт.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв.

Попробуйте переключить видеокарты в БИОСе,

как рекомендовано в этой теме.

Пожалуйста, сообщите мне о результатах.

Желаю удачи и хорошего дня!

Если вы считаете эту информацию полезной, прошу отметить ее как ответ

Был ли этот ответ полезным?

К сожалению, это не помогло.

Отлично! Благодарим за отзыв.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв, он поможет улучшить наш сайт.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв.

Доброго дня, Валерий!

С уважением, Андрей.

3 польз. нашли этот ответ полезным

Был ли этот ответ полезным?

К сожалению, это не помогло.

Отлично! Благодарим за отзыв.

Насколько Вы удовлетворены этим ответом?

Благодарим за отзыв, он поможет улучшить наш сайт.

Источник

Интерфейс PCI

Хотя многие пользователи компьютеров думают о PCI как о способе подключения электрических проводов, на самом деле это полный набор спецификаций, определяющих, как должны взаимодействовать разные части компьютера.

Спецификация PCI охватывает большинство вопросов, связанных с компьютерными интерфейсами. Мы не собираемся покрыть здесь их все; в этом разделе мы в основном касаемся того, как драйвер PCI может найти своё оборудование и получить к нему доступ. Методы зондирования, обсуждаемые в разделе «Параметры модуля» в Главе 2 и «Автоопределение номера прерывания» в Главе 10, могут использоваться с устройствами PCI, но спецификация предлагает альтернативу, которая более предпочтительна, чем зондирование.

Архитектура PCI был разработана в качестве замены стандарту ISA с тремя основными целями: получить лучшую производительность при передаче данных между компьютером и его периферией, быть независимой от платформы, насколько это возможно, и упростить добавление и удаление периферийных устройств в системе.

Шина PCI достигает лучшей производительности за счёт использования более высокой тактовой частоты, чем ISA; она работает на 25 или 33 МГц (фактическое значение зависит от частоты системы), и недавно были развернуты также 66 МГц и даже 133 МГц реализации. Кроме того, она оснащена 32-х разрядной шиной данных и в спецификацию было включено 64-х разрядное расширение. Независимость от платформы является частой целью в разработке компьютерной шины и это особенно важная особенность PCI, поскольку в мире ПК всегда доминировали стандарты интерфейсов, зависимые от процессора. В настоящее время PCI широко используется на системах IA-32, Alpha, PowerPC, SPARC64 и IA-64, а также некоторые других платформах.

Однако, наиболее актуальной для автора драйвера является поддержка PCI автоопределения интерфейса плат. PCI устройства безджамперные (в отличие от большинства старой периферии) и настраивается автоматически во время загрузки. Затем драйвер устройства должен быть в состоянии получить доступ к информации о конфигурации в устройстве с целью завершения инициализации. Это происходит без необходимости совершать какое-либо тестирование.

Адресация в PCI

Последние рабочие станции имеют по крайней мере две шины PCI. Подключение более одной шины в одной системе выполняется с помощью мостов, периферии PCI специального назначения, задачей которой является объединение двух шин. Общая схема системы PCI представляет собой дерево, где каждая шина связана с шиной верхнего уровня, вплоть до шины 0 в корне дерева. Система карт ПК CardBus (стандарт шины для PCMCIA) также подключена к системе PCI через мосты. Типичная система PCI представлена на Рисунке 12-1, где подсвечены различные мосты.

ldd layout typical pci system

Рисунок 12-1. Схема типичной системы PCI

Например, /proc/bus/pci/devices используют одно 16-ти разрядное поле (для облегчения анализа и сортировки), а /proc/bus/busnumber разделяет адрес на три поля. Следующий снимок демонстрирует, как выглядят эти адреса, показано только начало строк вывода:

0000:00:00.0 Host bridge

0000:00:00.1 RAM memory

0000:00:00.2 RAM memory

0000:00:02.0 USB Controller

0000:00:04.0 Multimedia audio controller

0000:00:07.0 ISA bridge

0000:00:09.0 USB Controller

0000:00:09.1 USB Controller

0000:00:09.2 USB Controller

0000:00:0c.0 CardBus bridge

0000:00:0f.0 IDE interface

0000:00:10.0 Ethernet controller

0000:00:12.0 Network controller

0000:00:13.0 FireWire (IEEE 1394)

0000:00:14.0 VGA compatible controller

В шине PCI пространство ввода/вывода использует 32-х разрядную шину адреса (что ведёт к 4 Гб портов ввода/вывода), в то время как пространство памяти может быть доступно или с 32-х разрядными, или 64-х разрядными адресами. 64-х разрядные адреса доступны на более новых платформах. Адреса должны быть уникальными для одного устройства, но программное обеспечение может ошибочно настроить два устройства на один адрес, делая невозможным доступ к любому из них. Но такой проблемы никогда не случится, если драйвер не будет играть с регистрами, которых не должен касаться. Хорошая новость в том, что каждая область памяти и адреса ввода/вывода, предлагаемые интерфейсной платой, могут быть переназначены с помощью операций по конфигурации. То есть встроенное программное обеспечение при загрузке системы инициализирует оборудование PCI, отображая каждую область на другой адрес во избежание конфликтов. (* На самом деле, такая конфигурация не ограничивается временем загрузки системы; например, устройства, подключаемые без выключения системы, не могут быть доступны во время загрузки и вместо этого появляются позже. Основным моментом здесь является то, что драйвер устройства не должен менять области адреса ввода/вывода или памяти.) Адреса, по которым эти регионы в настоящее время отображаются, могут быть прочитаны из конфигурационного пространства, поэтому драйвер Linux может получить доступ к своим устройствам без зондирования. После чтения регистров конфигурации драйвер может иметь безопасный доступ к своему оборудованию.

Читайте также:  Устройство и принцип работы акпп 01n

Пространство конфигурации PCI состоит из 256 байт для каждой функции устройства (за исключением устройств PCI Express, которые имеют 4 Кб конфигурационного пространства для каждой функции) и стандартизированную схему регистров конфигурации. Четыре байта конфигурационного пространства содержать уникальный ID функции, поэтому драйвер может определить своё устройство, глядя на заданный для такой периферии ID. (* Вы найдёте ID любого устройства в своём руководстве для оборудования. Перечень включён в файл pci.ids, часть пакета pciutils, и исходные тексты ядра; он не претендует на полноту, это просто список наиболее известных поставщиков и устройств. Версия ядра этого файла не будет включена в будущие серии ядра.) Таким образом, каждая плата устройства адресуема географически для получения её регистров конфигурации; затем информация в этих регистрах может быть использована для выполнения обычного доступа ввода/вывода, без необходимости дальнейшей географической адресации.

Из этого описания должно быть ясно, что основным новшеством стандартна интерфейса PCI перед ISA является пространство конфигурации адресов. Таким образом, в дополнение к обычному коду драйвера, драйверу PCI необходима возможность доступа к пространству конфигурации, чтобы предохранить себя от рискованных задач зондирования.

В оставшейся части этой главы мы используем слово устройство для ссылки на функцию устройства, потому что каждая функция в многофункциональной плате выступает в качестве независимого субъекта. Когда мы говорим об устройстве, мы имеем в виду набор «номера домена, номер шины, номер устройства и номер функции».

Момент загрузки

Чтобы увидеть, как работает PCI, мы начинаем с загрузки системы, поскольку устройства настраиваются именно тогда.

При подаче питания на устройство PCI его оборудование остаётся неактивным. Другими словами, устройство реагирует только на операции по конфигурации. При включении питания устройство не имеет памяти и портов ввода/вывода, связанных с адресным пространством компьютера; все другие функции, зависящие от устройства, такие как генерация прерываний, также отключены. К счастью, все материнские платы с PCI оснащены осведомлённым о PCI встроенным программным обеспечением, называемым BIOS, NVRAM, или PROM, в зависимости от платформы. Встроенное программное обеспечение обеспечивает доступ к адресному пространству конфигурации устройства чтением и записью регистров контроллера PCI.

Во время загрузки системы встроенное программное обеспечение (или ядро Linux, если так настроено) выполняет операции по конфигурации с каждой периферией PCI для того, чтобы выделить безопасное место для каждого адресуемого региона, предлагаемого ей. К тому времени, когда драйвер устройства обращается к устройству, его области памяти и ввода/вывода уже отображены в адресное пространство процессора. Драйвер может изменить это значение по умолчанию, но он никогда не должен этого делать.

Регистры конфигурации и инициализация

В этом разделе мы рассмотрим регистры конфигурации, которые содержат PCI устройства. Все PCI устройства содержат по крайней мере 256 байт адресного пространства. Первые 64 байт стандартизованы, а остальные зависят от устройства. Рисунок 12-2 показывает схему не зависящего от устройства конфигурационного пространства.

ldd standardized pci configuration registers

Рисунок 12-2. Стандартизированные конфигурационные регистры PCI

Как видно из рисунка, некоторые регистры конфигурации PCI необходимы и некоторые являются необязательными. Каждое устройство PCI должно содержать поддающиеся интерпретации значения в необходимых регистрах, а содержание необязательных регистров зависит от реальных возможностей периферии. Необязательные поля не используются, пока содержимое необходимых полей не покажет, что они являются действительными. Таким образом, обязательные поля декларируют возможности платы, в том числе, пригодность других полей.

Описание всех элементов конфигурации выходит за рамки этой книги. Как правило, техническая документация, выпущенная с каждым устройством, описывает поддерживаемые регистры. То, чем мы интересуемся, каким образом драйвер может увидеть своё устройство и как он может получить доступ к пространству конфигурации устройства.

Давайте посмотрим на эти регистры более подробно:

Этот 16-ти разрядный регистр идентифицирует изготовителя оборудования. Например, каждое устройство Intel отмаркировано одним и тем же числом поставщика, 0x8086. Существует глобальный реестр таких чисел, который ведёт PCI Special Interest Group, и производители должны обратиться туда, чтобы получить уникальный номер.

Это другой 16-ти разрядный регистр, выбранный производителем; для ID устройства не требуется никакой официальной регистрации. Этот ID, как правило, используется в паре с ID поставщика, создавая уникальный 32-х разрядный идентификатор аппаратного устройства. Мы используем слово сигнатура для обращения к ID поставщика и ID устройства в паре. Драйвер устройства обычно полагается на сигнатуру, чтобы определить своё устройство; вы можете найти, какое значение искать, в руководстве оборудования для целевого устройства.

Эти поля могут быть использованы для дальнейшей идентификации устройства. Если такая микросхема является обычным чипом интерфейса для локальной (на плате) шины, она часто используется в нескольких совершенно разных ролях и драйвер должен определить фактическое устройство для общения. Идентификаторы subsystem (подсистема) и используются для этой цели.

Эти два значения позволяют драйверу определить, какой тип устройства PCI класса он поддерживает. Разные классы устройств PCI (VGA контроллер является одним из примеров) описаны в спецификации PCI. Если драйвер может обрабатывать любой класс, для этих полей должно быть использовано значение 0.

Это значение не используется для соответствия устройству, но используется для хранения информации, которую драйвер PCI может использовать, чтобы различать устройства, если он этого хочет.

Существуют две вспомогательные макроса, которые должны использоваться для инициализации структуры struct pci_device_id :

Пример использования этих макросов для определения типа устройств, которые поддерживает драйвер, может быть найден в следующих файлах ядра:

static const struct pci_device_id pci_ids[ ] = < <

/* работаем с любым контроллером USB 2.0 EHCI */

.driver_data = (unsigned long) &ehci_driver,

static struct pci_device_id i810_ids[ ] = <

Эти примеры создают список структур struct pci_device_id с пустой структурой, проинициализированной нулями в качестве последнего значения в списке. Этот массив идентификаторов используется в структуре pci_driver (описанной ниже) и используется также, чтобы указать пользовательскому пространству, какие устройства поддерживает этот специфический драйвер.

MODULE_DEVICE_TABLE

Регистрация PCI драйвера

const struct pci_device_id *id_table;

int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);

void (*remove) (struct pci_dev *dev);

Читайте также:  Стучит глушитель при запуске двигателя

Указатель на функцию, которую вызывает ядро PCI, когда struct pci_dev удаляется из системы, или когда PCI драйвер выгружается из ядра. Подробнее об этой функции далее в этой главе.

int (*suspend) (struct pci_dev *dev, u32 state);

int (*resume) (struct pci_dev *dev);

Таким образом, чтобы создать правильную структуру struct pci_driver должны быть проинициализированы только четыре поля :

static struct pci_driver pci_driver = <

static int __init pci_skel_init(void)

• В системах с поддержкой горячего подключения PCI или системах CardBus, устройство PCI может появиться или исчезнуть в любой момент времени. Полезно, если драйверы могут быть загружены прежде, чем появится устройство, чтобы сократить время, необходимое для инициализации устройства.

static void __exit pci_skel_exit(void)

Старый способ зондирования PCI

Если способность находить определённое устройства PCI действительно необходима, доступны следующие функции:

struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from);

Пример правильного использования этой функции:

struct pci_dev *dev;

dev = pci_get_device(PCI_VENDOR_FOO, PCI_DEVICE_FOO, NULL);

/* Используем это PCI устройство */

struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,

unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from);

Эта функция не может быть вызвана из контекста прерывания. Если это случилось, в системный журнал печатается предупреждение.

struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);

Все эти функции не могут быть вызваны из контекста прерывания. Если это случилось, в системный журнал печатается предупреждение.

Разрешение устройства PCI

В функции probe драйвера PCI, прежде чем драйвер сможет получить доступ к любому ресурсу устройства (область ввода/вывода или прерывание) данного PCI устройства, драйвер должен вызвать функцию pci_enable_device :

int pci_enable_device(struct pci_dev *dev);

Эта функция фактически разрешает устройство. Она будит устройство и в некоторых случаях также задаёт ему линию прерывания и области ввода/вывода. Это происходит, например, с устройствами CardBus (которые были сделаны полностью эквивалентными PCI на уровне драйвера).

Доступ в пространство конфигурации

После обнаружения устройства драйвером, обычно необходимо читать или записывать в три адресные пространства: память, порт и конфигурацию. В частности, доступ к конфигурационному пространству является жизненно важным для драйвера, потому что только так он может узнать, как устройство отображается в памяти и пространстве ввода/вывода.

Поскольку микропроцессор не имеет возможности получить доступ к конфигурационному пространству напрямую, поставщик компьютера должен обеспечить способ сделать это. Для доступа к конфигурационному пространству процессор должен читать и записывать в регистры контроллера PCI, но точная реализация является зависимой от поставщика и не имеет отношения к этому обсуждению, потому что Linux предлагает стандартный интерфейс для доступа к конфигурационному пространству.

int pci_read_config_byte(struct pci_dev *dev, int where, u8 *val);

int pci_read_config_word(struct pci_dev *dev, int where, u16 *val);

int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val);

int pci_write_config_byte(struct pci_dev *dev, int where, u8 val);

int pci_write_config_word(struct pci_dev *dev, int where, u16 val);

int pci_write_config_dword(struct pci_dev *dev, int where, u32 val);

Все предыдущие функции реализованы в виде встраиваемых функций, которые на самом деле вызывают следующие функции. Не стесняйтесь использовать эти функции взамен вышеприведённых в случае, если в какой-то момент времени драйвер не имеет доступа к struct pci_dev :

int pci_bus_read_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 *val);

int pci_bus_read_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16 *val);

int pci_bus_read_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32 *val);

int pci_bus_write_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 val);

int pci_bus_write_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16 val);

int pci_bus_write_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32 val);

static unsigned char skel_get_revision(struct pci_dev *dev)

Доступ к пространствам ввода/вывода и памяти

В ядре регионы ввода/вывода PCI устройств были интегрированы в общее управление ресурсами. По этой причине вам не требуется обращаться к переменным конфигурации, чтобы узнать, где ваше устройство отображено на память или пространство ввода/вывода. Предпочтительный интерфейс для получения информации о регионе состоит из следующих функций:

unsigned long pci_resource_start(struct pci_dev *dev, int bar);

unsigned long pci_resource_end(struct pci_dev *dev, int bar);

unsigned long pci_resource_flags(struct pci_dev *dev, int bar);

Эта функция возвращает флаги, связанные с этим ресурсом.

Флаги ресурсов, используемые для определения некоторых особенностей отдельного ресурса. Для ресурсов PCI, связанных регионами ввода/вывода PCI, эта информация извлекается из регистров базовых адресов, но может прийти из других мест для ресурсов, не связанных с PCI устройствами.

Если связанный регион ввода/вывода существует, один и только один из этих флагов установлен.

Эти флаги определяют, является ли область памяти упреждающей и/или защищённой от записи. Последний флаг для ресурсов PCI никогда не устанавливается.

PCI прерывания

Если устройство не поддерживает прерывания, регистр 61 (PCI_INTERRUPT_PIN) равен 0; в противном случае он не равен нулю. Однако, поскольку драйвер знает, является ли его устройство управляемым прерыванием или нет, читать PCI_INTERRUPT_PIN обычно необходимости нет.

Таким образом, коду PCI, предназначенному для работы с прерываниями, просто необходимо прочитать байт конфигурации, чтобы получить номер прерывания, который сохраняется в локальную переменную, как показано на следующем коде. Помимо этого, применяется информация, содержащаяся в Главе 10.

result = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &myirq);

/* имеем дело с ошибкой */

В оставшейся части этого раздела приводится дополнительная информация для любопытных читателей, но не требующаяся для написания драйверов.

Разъём PCI имеет четыре контакта прерывания и периферийные платы могут использовать любой или их все. Каждый контакт подключён индивидуально к контроллеру прерываний в материнской плате, так что прерывания могут быть разделяемыми без каких-либо электрических проблем. Контроллер прерываний ответственен за связь проводов (контактов) прерывания с аппаратной частью процессора; эта зависящая от платформы операция остаётся в контроллере для достижения платформо-независимости в самой шине.

Аппаратные абстракции

Мы завершаем обсуждение PCI делая быстрый взгляд на то, как система работает со множеством контроллеров PCI, имеющихся на рынке. Это просто информационный раздел, призванный показать любопытному читателю, как объектно-ориентированная схема ядра простирается вплоть до самых низких уровней.

Механизм, используемый для реализации аппаратной абстракции, является обычной структурой, содержащей методы. Это мощная техника, которая добавляет только минимальные накладные расходы разыменования указателя к обычным накладным расходам вызова функции. В случае с управлением PCI, единственными аппаратно-зависимыми операциями являются те, которые считывают и записывают конфигурационные регистры, потому что всё остальное выполняется в мире PCI непосредственным чтением и записью в пространства ввода/вывода и адресов памяти, и те находятся под прямым контролем центрального процессора.

Таким образом, соответствующая структура для доступа к конфигурационному регистру включает в себя только два поля:

int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);

int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);

dev->bus->ops->read(bus, devfn, where, 8, val);

Источник

Оцените статью
Adblock
detector