mirror of https://github.com/ipxe/ipxe.git
153 lines
3.8 KiB
C
153 lines
3.8 KiB
C
/*
|
|
* Copyright (C) 2010 Piotr Jaroszyński <p.jaroszynski@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef _IPXE_LINUX_H
|
|
#define _IPXE_LINUX_H
|
|
|
|
FILE_LICENCE(GPL2_OR_LATER);
|
|
|
|
/** @file
|
|
*
|
|
* Linux devices, drivers and device requests.
|
|
*/
|
|
|
|
#include <ipxe/list.h>
|
|
#include <ipxe/device.h>
|
|
#include <ipxe/settings.h>
|
|
|
|
/**
|
|
* Convert a Linux error number to an iPXE status code
|
|
*
|
|
* @v errno Linux error number
|
|
* @ret rc iPXE status code (before negation)
|
|
*/
|
|
#define ELINUX( errno ) EPLATFORM ( EINFO_EPLATFORM, errno )
|
|
|
|
/** A linux device */
|
|
struct linux_device {
|
|
/** Generic device */
|
|
struct device dev;
|
|
/** Driver that's handling the device */
|
|
struct linux_driver *driver;
|
|
/** Private data used by drivers */
|
|
void *priv;
|
|
};
|
|
|
|
struct linux_device_request;
|
|
|
|
/** A linux driver */
|
|
struct linux_driver {
|
|
/** Name */
|
|
char *name;
|
|
/** Probe function */
|
|
int (*probe)(struct linux_device *device, struct linux_device_request *request);
|
|
/** Remove function */
|
|
void (*remove)(struct linux_device *device);
|
|
/** Can the driver probe any more devices? */
|
|
int can_probe;
|
|
};
|
|
|
|
/** Linux driver table */
|
|
#define LINUX_DRIVERS __table(struct linux_driver, "linux_drivers")
|
|
|
|
/** Declare a Linux driver */
|
|
#define __linux_driver __table_entry(LINUX_DRIVERS, 01)
|
|
|
|
/**
|
|
* Set linux device driver-private data
|
|
*
|
|
* @v device Linux device
|
|
* @v priv Private data
|
|
*/
|
|
static inline void linux_set_drvdata(struct linux_device * device, void *priv)
|
|
{
|
|
device->priv = priv;
|
|
}
|
|
|
|
/**
|
|
* Get linux device driver-private data
|
|
*
|
|
* @v device Linux device
|
|
* @ret priv Private data
|
|
*/
|
|
static inline void *linux_get_drvdata(struct linux_device *device)
|
|
{
|
|
return device->priv;
|
|
}
|
|
|
|
/**
|
|
* A device request.
|
|
*
|
|
* To be created and filled by the UI code.
|
|
*/
|
|
struct linux_device_request {
|
|
/** Driver name. Compared to the linux drivers' names */
|
|
char *driver;
|
|
/** List node */
|
|
struct list_head list;
|
|
/** List of settings */
|
|
struct list_head settings;
|
|
};
|
|
|
|
/** A device request setting */
|
|
struct linux_setting {
|
|
/** Name */
|
|
char *name;
|
|
/** Value */
|
|
char *value;
|
|
/** Was the setting already applied? */
|
|
int applied;
|
|
/** List node */
|
|
struct list_head list;
|
|
};
|
|
|
|
/**
|
|
* List of requested devices.
|
|
*
|
|
* Filled by the UI code. Linux root_driver walks over this list looking for an
|
|
* appropriate driver to handle each request by matching the driver's name.
|
|
*/
|
|
extern struct list_head linux_device_requests;
|
|
|
|
/**
|
|
* List of global settings to apply.
|
|
*
|
|
* Filled by the UI code. Linux root_driver applies these settings.
|
|
*/
|
|
extern struct list_head linux_global_settings;
|
|
|
|
/**
|
|
* Look for the last occurrence of a setting with the specified name
|
|
*
|
|
* @v name Name of the setting to look for
|
|
* @v settings List of the settings to look through
|
|
*/
|
|
struct linux_setting *linux_find_setting(char *name, struct list_head *settings);
|
|
|
|
/**
|
|
* Apply a list of linux settings to a settings block
|
|
*
|
|
* @v new_settings List of linux_setting's to apply
|
|
* @v settings_block Settings block to apply the settings to
|
|
* @ret rc 0 on success
|
|
*/
|
|
extern void linux_apply_settings(struct list_head *new_settings, struct settings *settings_block);
|
|
|
|
|
|
#endif /* _IPXE_LINUX_H */
|