iPXE
pcivpd.h
Go to the documentation of this file.
1#ifndef _IPXE_PCIVPD_H
2#define _IPXE_PCIVPD_H
3
4/**
5 * @file
6 *
7 * PCI Vital Product Data
8 *
9 */
10
11FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
12
13#include <stdint.h>
14#include <byteswap.h>
15#include <ipxe/isapnp.h>
16#include <ipxe/pci.h>
17
18/** PCI VPD address register */
19#define PCI_VPD_ADDRESS 0x02
20
21/** PCI VPD write flag */
22#define PCI_VPD_FLAG 0x8000
23
24/** PCI VPD data register */
25#define PCI_VPD_DATA 0x04
26
27/** A PCI VPD field */
29 /** Keyword */
31 /** Length */
33} __attribute__ (( packed ));
34
35/** Maximum PCI VPD field length */
36#define PCI_VPD_MAX_LEN 0xff
37
38/** Construct PCI VPD field descriptor
39 *
40 * @v tag ISAPnP tag
41 * @v keyword1 First character of keyword
42 * @v keyword2 Second character of keyword
43 * @ret field VPD field descriptor
44 */
45#define PCI_VPD_FIELD( tag, keyword1, keyword2 ) \
46 ( ( (tag) << 16 ) | ( (keyword2) << 8 ) | ( (keyword1) << 0 ) )
47
48/** Construct PCI VPD whole-tag field descriptor
49 *
50 * @v tag ISAPnP tag
51 * @ret field VPD field descriptor
52 */
53#define PCI_VPD_WHOLE_TAG_FIELD( tag ) PCI_VPD_FIELD ( (tag), '\0', '\0' )
54
55/** Extract PCI VPD ISAPnP tag
56 *
57 * @v field VPD field descriptor
58 * @ret tag ISAPnP tag
59 */
60#define PCI_VPD_TAG( field ) ( (field) >> 16 )
61
62/** Extract PCI VPD keyword
63 *
64 * @v field VPD field descriptor
65 * @ret keyword Keyword
66 */
67#define PCI_VPD_KEYWORD( field ) ( cpu_to_le16 ( (field) & 0xffff ) )
68
69/** PCI VPD field debug message format */
70#define PCI_VPD_FIELD_FMT "%c%c"
71
72/** PCI VPD field debug message arguments */
73#define PCI_VPD_FIELD_ARGS( field ) \
74 ( (field) >> 0 ), ( (field) >> 8 )
75
76/** PCI VPD Read-Only field tag */
77#define PCI_VPD_TAG_RO 0x90
78
79/** PCI VPD Read-Write field tag */
80#define PCI_VPD_TAG_RW 0x91
81
82/** PCI VPD Card Name field descriptor */
83#define PCI_VPD_FIELD_NAME PCI_VPD_WHOLE_TAG_FIELD ( ISAPNP_TAG_ANSISTR )
84
85/** PCI VPD Part Number field descriptor */
86#define PCI_VPD_FIELD_PN PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'P', 'N' )
87
88/** PCI VPD Engineering Change Level field descriptor */
89#define PCI_VPD_FIELD_EC PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'E', 'C' )
90
91/** PCI VPD Fabric Geography field descriptor */
92#define PCI_VPD_FIELD_FG PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'F', 'G' )
93
94/** PCI VPD Location field descriptor */
95#define PCI_VPD_FIELD_LC PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'L', 'C' )
96
97/** PCI VPD Manufacturer ID field descriptor */
98#define PCI_VPD_FIELD_MN PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'M', 'N' )
99
100/** PCI VPD PCI Geography field descriptor */
101#define PCI_VPD_FIELD_PG PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'P', 'G' )
102
103/** PCI VPD Serial Number field descriptor */
104#define PCI_VPD_FIELD_SN PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'S', 'N' )
105
106/** PCI VPD Extended Capability field descriptor */
107#define PCI_VPD_FIELD_CP PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'C', 'P' )
108
109/** PCI VPD Checksum and Reserved field descriptor */
110#define PCI_VPD_FIELD_RV PCI_VPD_FIELD ( PCI_VPD_TAG_RO, 'R', 'V' )
111
112/** PCI VPD Asset Tag field descriptor */
113#define PCI_VPD_FIELD_YA PCI_VPD_FIELD ( PCI_VPD_TAG_RW, 'Y', 'A' )
114
115/** PCI VPD Remaining Read/Write Area field descriptor */
116#define PCI_VPD_FIELD_RW PCI_VPD_FIELD ( PCI_VPD_TAG_RW, 'R', 'W' )
117
118/** Maximum wait for PCI VPD (in ms) */
119#define PCI_VPD_MAX_WAIT_MS 100
120
121/** PCI VPD cache */
123 /** Address */
125 /** Data */
127};
128
129/** PCI VPD */
130struct pci_vpd {
131 /** PCI device */
133 /** VPD capability offset */
134 int cap;
135 /** Read cache */
137};
138
139/**
140 * Check for presence of PCI VPD
141 *
142 * @v vpd PCI VPD
143 * @ret is_present VPD is present
144 */
145static inline __attribute__ (( always_inline )) int
147 return ( vpd->cap != 0 );
148}
149
150/**
151 * Check if PCI VPD read cache is valid
152 *
153 * @v vpd PCI VPD
154 * @ret is_valid Read cache is valid
155 */
156static inline __attribute__ (( always_inline )) int
158 return ( vpd->cache.address >= 0 );
159}
160
161/**
162 * Invalidate PCI VPD read cache
163 *
164 * @v vpd PCI VPD
165 */
166static inline __attribute__ (( always_inline )) void
168 vpd->cache.address = -1;
169}
170
171extern int pci_vpd_init ( struct pci_vpd *vpd, struct pci_device *pci );
172extern int pci_vpd_read ( struct pci_vpd *vpd, unsigned int address,
173 void *buf, size_t len );
174extern int pci_vpd_write ( struct pci_vpd *vpd, unsigned int address,
175 const void *buf, size_t len );
176extern int pci_vpd_find ( struct pci_vpd *vpd, unsigned int field,
177 unsigned int *address, size_t *len );
178extern int pci_vpd_resize ( struct pci_vpd *vpd, unsigned int field,
179 size_t len, unsigned int *address );
180
181#endif /* _IPXE_PCIVPD_H */
unsigned short uint16_t
Definition stdint.h:11
unsigned int uint32_t
Definition stdint.h:12
unsigned char uint8_t
Definition stdint.h:10
ring len
Length.
Definition dwmac.h:226
uint64_t address
Base address.
Definition ena.h:13
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define __attribute__(x)
Definition compiler.h:10
PCI bus.
int pci_vpd_read(struct pci_vpd *vpd, unsigned int address, void *buf, size_t len)
Read PCI VPD.
Definition pcivpd.c:183
int pci_vpd_resize(struct pci_vpd *vpd, unsigned int field, size_t len, unsigned int *address)
Resize VPD field.
Definition pcivpd.c:411
int pci_vpd_write(struct pci_vpd *vpd, unsigned int address, const void *buf, size_t len)
Write PCI VPD.
Definition pcivpd.c:225
int pci_vpd_find(struct pci_vpd *vpd, unsigned int field, unsigned int *address, size_t *len)
Locate PCI VPD field.
Definition pcivpd.c:353
static int pci_vpd_is_present(struct pci_vpd *vpd)
Check for presence of PCI VPD.
Definition pcivpd.h:146
static int pci_vpd_cache_is_valid(struct pci_vpd *vpd)
Check if PCI VPD read cache is valid.
Definition pcivpd.h:157
static void pci_vpd_invalidate_cache(struct pci_vpd *vpd)
Invalidate PCI VPD read cache.
Definition pcivpd.h:167
int pci_vpd_init(struct pci_vpd *vpd, struct pci_device *pci)
Initialise PCI Vital Product Data.
Definition pcivpd.c:48
A PCI device.
Definition pci.h:211
PCI VPD cache.
Definition pcivpd.h:122
int address
Address.
Definition pcivpd.h:124
uint32_t data
Data.
Definition pcivpd.h:126
A PCI VPD field.
Definition pcivpd.h:28
uint16_t keyword
Keyword.
Definition pcivpd.h:30
uint8_t len
Length.
Definition pcivpd.h:32
PCI VPD.
Definition pcivpd.h:130
int cap
VPD capability offset.
Definition pcivpd.h:134
struct pci_device * pci
PCI device.
Definition pcivpd.h:132
struct pci_vpd_cache cache
Read cache.
Definition pcivpd.h:136