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>
#include <config/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 39 of file isa.c.

◆ ISA_IOIDX_MIN

#define ISA_IOIDX_MIN (   driver)    ( -ISA_EXTRA_PROBE_ADDR_COUNT )

Definition at line 42 of file isa.c.

◆ ISA_IOIDX_MAX

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

Definition at line 46 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:39
static isa_probe_addr_t isa_extra_probe_addrs[]
Definition: isa.c:34

Definition at line 49 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 152 of file isa.c.

152  {
153  struct isa_device *isa;
154  struct isa_device *tmp;
155 
156  list_for_each_entry_safe ( isa, tmp, &rootdev->dev.children,
157  dev.siblings ) {
158  isa_remove ( isa );
159  list_del ( &isa->dev.siblings );
160  free ( isa );
161  }
162 }
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
unsigned long tmp
Definition: linux_pci.h:53
#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:458
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct list_head siblings
Devices on the same bus.
Definition: device.h:81
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:82

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 62 of file isa.c.

62  {
63  int rc;
64 
65  DBG ( "Trying ISA driver %s at I/O %04x\n",
66  isa->driver->name, isa->ioaddr );
67 
68  if ( ( rc = isa->driver->probe ( isa ) ) != 0 ) {
69  DBG ( "...probe failed\n" );
70  return rc;
71  }
72 
73  DBG ( "...device found\n" );
74  return 0;
75 }
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 82 of file isa.c.

82  {
83  isa->driver->remove ( isa );
84  DBG ( "Removed ISA%04x\n", isa->ioaddr );
85 }
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 95 of file isa.c.

95  {
96  struct isa_device *isa = NULL;
97  struct isa_driver *driver;
98  long ioidx;
99  int rc;
100 
101  for_each_table_entry ( driver, ISA_DRIVERS ) {
102  for ( ioidx = ISA_IOIDX_MIN ( driver ) ;
103  ioidx <= ISA_IOIDX_MAX ( driver ) ; ioidx++ ) {
104  /* Allocate struct isa_device */
105  if ( ! isa )
106  isa = malloc ( sizeof ( *isa ) );
107  if ( ! isa ) {
108  rc = -ENOMEM;
109  goto err;
110  }
111  memset ( isa, 0, sizeof ( *isa ) );
112  isa->driver = driver;
113  isa->ioaddr = ISA_IOADDR ( driver, ioidx );
114 
115  /* Add to device hierarchy */
116  snprintf ( isa->dev.name, sizeof ( isa->dev.name ),
117  "ISA%04x", isa->ioaddr );
118  isa->dev.driver_name = driver->name;
119  isa->dev.desc.bus_type = BUS_TYPE_ISA;
120  isa->dev.desc.vendor = driver->vendor_id;
121  isa->dev.desc.device = driver->prod_id;
122  isa->dev.parent = &rootdev->dev;
123  list_add ( &isa->dev.siblings,
124  &rootdev->dev.children );
125  INIT_LIST_HEAD ( &isa->dev.children );
126 
127  /* Try probing at this I/O address */
128  if ( isa_probe ( isa ) == 0 ) {
129  /* isadev registered, we can drop our ref */
130  isa = NULL;
131  } else {
132  /* Not registered; re-use struct */
133  list_del ( &isa->dev.siblings );
134  }
135  }
136  }
137 
138  free ( isa );
139  return 0;
140 
141  err:
142  free ( isa );
143  isabus_remove ( rootdev );
144  return rc;
145 }
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:49
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:152
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:62
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:385
#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:46
struct isa_driver * driver
Driver for this device.
Definition: isa.h:18
#define ISA_IOIDX_MIN(driver)
Definition: isa.c:42
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
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 34 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:152
static int isabus_probe(struct root_device *rootdev)
Probe ISA root bus.
Definition: isa.c:95

ISA bus root device driver.

Definition at line 165 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:165

ISA bus root device.

Definition at line 171 of file isa.c.