iPXE
Macros | Functions | Variables
isa.c File Reference
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/io.h>
#include <ipxe/isa.h>

Go to the source code of this file.

Macros

#define ISA_EXTRA_PROBE_ADDR_COUNT   ( sizeof ( isa_extra_probe_addrs ) / sizeof ( isa_extra_probe_addrs[0] ) )
 
#define ISA_IOIDX_MIN(driver)   ( -ISA_EXTRA_PROBE_ADDR_COUNT )
 
#define ISA_IOIDX_MAX(driver)   ( (int) (driver)->addr_count - 1 )
 
#define ISA_IOADDR(driver, ioidx)
 

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 
static void isabus_remove (struct root_device *rootdev)
 Remove ISA root bus. More...
 
static int isa_probe (struct isa_device *isa)
 Probe an ISA device. More...
 
static void isa_remove (struct isa_device *isa)
 Remove an ISA device. More...
 
static int isabus_probe (struct root_device *rootdev)
 Probe ISA root bus. More...
 

Variables

static isa_probe_addr_t isa_extra_probe_addrs []
 
static struct root_driver isa_root_driver
 ISA bus root device driver. More...
 
struct root_device isa_root_device __root_device
 ISA bus root device. More...
 

Macro Definition Documentation

◆ ISA_EXTRA_PROBE_ADDR_COUNT

#define ISA_EXTRA_PROBE_ADDR_COUNT   ( sizeof ( isa_extra_probe_addrs ) / sizeof ( isa_extra_probe_addrs[0] ) )

Definition at line 38 of file isa.c.

◆ ISA_IOIDX_MIN

#define ISA_IOIDX_MIN (   driver)    ( -ISA_EXTRA_PROBE_ADDR_COUNT )

Definition at line 41 of file isa.c.

◆ ISA_IOIDX_MAX

#define ISA_IOIDX_MAX (   driver)    ( (int) (driver)->addr_count - 1 )

Definition at line 45 of file isa.c.

◆ ISA_IOADDR

#define ISA_IOADDR (   driver,
  ioidx 
)
Value:
( ( (ioidx) >= 0 ) ? \
(driver)->probe_addrs[(ioidx)] : \
struct eisa_driver * driver
Driver for this device.
Definition: eisa.h:50
#define ISA_EXTRA_PROBE_ADDR_COUNT
Definition: isa.c:38
static isa_probe_addr_t isa_extra_probe_addrs[]
Definition: isa.c:33

Definition at line 48 of file isa.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER  )

◆ isabus_remove()

static void isabus_remove ( struct root_device rootdev)
static

Remove ISA root bus.

Parameters
rootdevISA bus root device

Definition at line 151 of file isa.c.

151  {
152  struct isa_device *isa;
153  struct isa_device *tmp;
154 
155  list_for_each_entry_safe ( isa, tmp, &rootdev->dev.children,
156  dev.siblings ) {
157  isa_remove ( isa );
158  list_del ( &isa->dev.siblings );
159  free ( isa );
160  }
161 }
An ISA device.
Definition: isa.h:12
struct device dev
Generic device.
Definition: isa.h:14
struct device dev
Device chain.
Definition: device.h:99
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:447
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct list_head siblings
Devices on the same bus.
Definition: device.h:81
uint8_t * tmp
Definition: entropy.h:156
struct list_head children
Devices attached to this device.
Definition: device.h:83
static void isa_remove(struct isa_device *isa)
Remove an ISA device.
Definition: isa.c:81

References device::children, isa_device::dev, root_device::dev, free, isa_remove(), list_del, list_for_each_entry_safe, device::siblings, and tmp.

Referenced by isabus_probe().

◆ isa_probe()

static int isa_probe ( struct isa_device isa)
static

Probe an ISA device.

Parameters
isaISA device
Return values
rcReturn status code

Definition at line 61 of file isa.c.

61  {
62  int rc;
63 
64  DBG ( "Trying ISA driver %s at I/O %04x\n",
65  isa->driver->name, isa->ioaddr );
66 
67  if ( ( rc = isa->driver->probe ( isa ) ) != 0 ) {
68  DBG ( "...probe failed\n" );
69  return rc;
70  }
71 
72  DBG ( "...device found\n" );
73  return 0;
74 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint16_t ioaddr
I/O address.
Definition: isa.h:16
const char * name
Name.
Definition: isa.h:36
int(* probe)(struct isa_device *isa)
Probe device.
Definition: isa.h:52
struct isa_driver * driver
Driver for this device.
Definition: isa.h:18
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References DBG, isa_device::driver, isa_device::ioaddr, isa_driver::name, isa_driver::probe, and rc.

Referenced by isabus_probe().

◆ isa_remove()

static void isa_remove ( struct isa_device isa)
static

Remove an ISA device.

Parameters
isaISA device

Definition at line 81 of file isa.c.

81  {
82  isa->driver->remove ( isa );
83  DBG ( "Removed ISA%04x\n", isa->ioaddr );
84 }
uint16_t ioaddr
I/O address.
Definition: isa.h:16
void(* remove)(struct isa_device *isa)
Remove device.
Definition: isa.h:58
struct isa_driver * driver
Driver for this device.
Definition: isa.h:18
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References DBG, isa_device::driver, isa_device::ioaddr, and isa_driver::remove.

Referenced by isabus_remove().

◆ isabus_probe()

static int isabus_probe ( struct root_device rootdev)
static

Probe ISA root bus.

Parameters
rootdevISA bus root device

Scans the ISA bus for devices and registers all devices it can find.

Definition at line 94 of file isa.c.

94  {
95  struct isa_device *isa = NULL;
96  struct isa_driver *driver;
97  int ioidx;
98  int rc;
99 
100  for_each_table_entry ( driver, ISA_DRIVERS ) {
101  for ( ioidx = ISA_IOIDX_MIN ( driver ) ;
102  ioidx <= ISA_IOIDX_MAX ( driver ) ; ioidx++ ) {
103  /* Allocate struct isa_device */
104  if ( ! isa )
105  isa = malloc ( sizeof ( *isa ) );
106  if ( ! isa ) {
107  rc = -ENOMEM;
108  goto err;
109  }
110  memset ( isa, 0, sizeof ( *isa ) );
111  isa->driver = driver;
112  isa->ioaddr = ISA_IOADDR ( driver, ioidx );
113 
114  /* Add to device hierarchy */
115  snprintf ( isa->dev.name, sizeof ( isa->dev.name ),
116  "ISA%04x", isa->ioaddr );
117  isa->dev.driver_name = driver->name;
118  isa->dev.desc.bus_type = BUS_TYPE_ISA;
119  isa->dev.desc.vendor = driver->vendor_id;
120  isa->dev.desc.device = driver->prod_id;
121  isa->dev.parent = &rootdev->dev;
122  list_add ( &isa->dev.siblings,
123  &rootdev->dev.children );
124  INIT_LIST_HEAD ( &isa->dev.children );
125 
126  /* Try probing at this I/O address */
127  if ( isa_probe ( isa ) == 0 ) {
128  /* isadev registered, we can drop our ref */
129  isa = NULL;
130  } else {
131  /* Not registered; re-use struct */
132  list_del ( &isa->dev.siblings );
133  }
134  }
135  }
136 
137  free ( isa );
138  return 0;
139 
140  err:
141  free ( isa );
142  isabus_remove ( rootdev );
143  return rc;
144 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint16_t ioaddr
I/O address.
Definition: isa.h:16
const char * name
Name.
Definition: isa.h:36
An ISA device.
Definition: isa.h:12
struct device dev
Generic device.
Definition: isa.h:14
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
char name[40]
Name.
Definition: device.h:75
uint16_t prod_id
Product ID to be assumed for this device.
Definition: isa.h:44
#define ISA_IOADDR(driver, ioidx)
Definition: isa.c:48
struct device dev
Device chain.
Definition: device.h:99
unsigned int vendor
Vendor ID.
Definition: device.h:31
struct device * parent
Bus device.
Definition: device.h:85
uint16_t vendor_id
Manufacturer ID to be assumed for this device.
Definition: isa.h:42
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define BUS_TYPE_ISA
ISA bus type.
Definition: device.h:55
static void isabus_remove(struct root_device *rootdev)
Remove ISA root bus.
Definition: isa.c:151
const char * driver_name
Driver name.
Definition: device.h:77
static int isa_probe(struct isa_device *isa)
Probe an ISA device.
Definition: isa.c:61
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct list_head siblings
Devices on the same bus.
Definition: device.h:81
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:358
#define ISA_DRIVERS
ISA driver table.
Definition: isa.h:62
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:583
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
unsigned int bus_type
Bus type.
Definition: device.h:24
unsigned int device
Device ID.
Definition: device.h:33
struct list_head children
Devices attached to this device.
Definition: device.h:83
struct device_description desc
Device description.
Definition: device.h:79
An ISA driver.
Definition: isa.h:34
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382
#define ISA_IOIDX_MAX(driver)
Definition: isa.c:45
struct isa_driver * driver
Driver for this device.
Definition: isa.h:18
#define ISA_IOIDX_MIN(driver)
Definition: isa.c:41
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
void * memset(void *dest, int character, size_t len) __nonnull

References device_description::bus_type, BUS_TYPE_ISA, device::children, device::desc, isa_device::dev, root_device::dev, device_description::device, isa_device::driver, device::driver_name, ENOMEM, for_each_table_entry, free, INIT_LIST_HEAD, isa_device::ioaddr, ISA_DRIVERS, ISA_IOADDR, ISA_IOIDX_MAX, ISA_IOIDX_MIN, isa_probe(), isabus_remove(), list_add, list_del, malloc(), memset(), isa_driver::name, device::name, NULL, device::parent, isa_driver::prod_id, rc, device::siblings, snprintf(), device_description::vendor, and isa_driver::vendor_id.

Variable Documentation

◆ isa_extra_probe_addrs

isa_probe_addr_t isa_extra_probe_addrs[]
static
Initial value:
= {
}

Definition at line 33 of file isa.c.

◆ isa_root_driver

struct root_driver isa_root_driver
static
Initial value:
= {
.probe = isabus_probe,
.remove = isabus_remove,
}
static void isabus_remove(struct root_device *rootdev)
Remove ISA root bus.
Definition: isa.c:151
static int isabus_probe(struct root_device *rootdev)
Probe ISA root bus.
Definition: isa.c:94

ISA bus root device driver.

Definition at line 164 of file isa.c.

◆ __root_device

struct root_device isa_root_device __root_device
Initial value:
= {
.dev = { .name = "ISA" },
.driver = &isa_root_driver,
}
static struct root_driver isa_root_driver
ISA bus root device driver.
Definition: isa.c:164

ISA bus root device.

Definition at line 170 of file isa.c.