iPXE
pci_settings.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25FILE_SECBOOT ( PERMITTED );
26
27#include <stdio.h>
28#include <string.h>
29#include <errno.h>
30#include <ipxe/pci.h>
31#include <ipxe/settings.h>
32#include <ipxe/init.h>
33
34/** @file
35 *
36 * PCI device settings
37 *
38 */
39
40/** PCI device settings scope */
42
43/**
44 * Check applicability of PCI device setting
45 *
46 * @v settings Settings block
47 * @v setting Setting
48 * @ret applies Setting applies within this settings block
49 */
51 const struct setting *setting ) {
52
53 return ( setting->scope == &pci_settings_scope );
54}
55
56/**
57 * Fetch value of PCI device setting
58 *
59 * @v settings Settings block
60 * @v setting Setting to fetch
61 * @v data Buffer to fill with setting data
62 * @v len Length of buffer
63 * @ret len Length of setting data, or negative error
64 */
66 struct setting *setting,
67 void *data, size_t len ) {
68 struct pci_device pci;
69 unsigned int tag_busdevfn;
70 unsigned int tag_offset;
71 unsigned int tag_len;
72 unsigned int i;
73
74 /* Extract busdevfn, offset, and length from tag */
75 tag_busdevfn = ( setting->tag >> 16 );
76 tag_offset = ( ( setting->tag >> 8 ) & 0xff );
77 tag_len = ( ( setting->tag >> 0 ) & 0xff );
78
79 /* Locate PCI device */
80 memset ( &pci, 0, sizeof ( pci ) );
81 pci_init ( &pci, tag_busdevfn );
82 DBG ( PCI_FMT " reading %#02x+%#x\n", PCI_ARGS ( &pci ),
83 tag_offset, tag_len );
84
85 /* Read data one byte at a time, in reverse order (since PCI
86 * is little-endian and iPXE settings are essentially
87 * big-endian).
88 */
89 tag_offset += tag_len;
90 for ( i = 0 ; ( ( i < tag_len ) && ( i < len ) ); i++ ) {
91 pci_read_config_byte ( &pci, --tag_offset, data++ );
92 }
93
94 /* Set type to ":hexraw" if not already specified */
95 if ( ! setting->type )
96 setting->type = &setting_type_hexraw;
97
98 return tag_len;
99}
100
101/** PCI device settings operations */
103 .applies = pci_settings_applies,
104 .fetch = pci_settings_fetch,
105};
106
107/** PCI device settings */
108static struct settings pci_settings = {
109 .refcnt = NULL,
110 .siblings = LIST_HEAD_INIT ( pci_settings.siblings ),
111 .children = LIST_HEAD_INIT ( pci_settings.children ),
113 .default_scope = &pci_settings_scope,
114};
115
116/** Initialise PCI device settings */
117static void pci_settings_init ( void ) {
118 int rc;
119
120 if ( ( rc = register_settings ( &pci_settings, NULL, "pci" ) ) != 0 ) {
121 DBG ( "PCI could not register settings: %s\n",
122 strerror ( rc ) );
123 return;
124 }
125}
126
127/** PCI device settings initialiser */
128struct init_fn pci_settings_init_fn __init_fn ( INIT_NORMAL ) = {
129 .name = "pci",
130 .initialise = pci_settings_init,
131};
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
Error codes.
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
#define INIT_NORMAL
Normal initialisation.
Definition init.h:32
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.
Configuration settings.
String functions.
void * memset(void *dest, int character, size_t len) __nonnull
#define __init_fn(init_order)
Declare an initialisation functon.
Definition init.h:24
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition list.h:31
PCI bus.
#define PCI_FMT
PCI device debug message format.
Definition pci.h:312
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition pci.h:315
static void pci_init(struct pci_device *pci, unsigned int busdevfn)
Initialise PCI device.
Definition pci.h:341
static void pci_settings_init(void)
Initialise PCI device settings.
static int pci_settings_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of PCI device setting.
static int pci_settings_fetch(struct settings *settings __unused, struct setting *setting, void *data, size_t len)
Fetch value of PCI device setting.
static struct settings pci_settings
PCI device settings.
static struct settings_operations pci_settings_operations
PCI device settings operations.
static const struct settings_scope pci_settings_scope
PCI device settings scope.
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition settings.c:476
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
An initialisation function.
Definition init.h:15
A PCI device.
Definition pci.h:211
A setting.
Definition settings.h:24
const struct settings_scope * scope
Setting scope (or NULL)
Definition settings.h:50
const struct setting_type * type
Setting type.
Definition settings.h:37
uint64_t tag
Setting tag, if applicable.
Definition settings.h:44
Settings block operations.
Definition settings.h:86
A setting scope.
Definition settings.h:177
A settings block.
Definition settings.h:133