Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
firmware
iscsi_ibft_find.c
Go to the documentation of this file.
1
/*
2
* Copyright 2007-2010 Red Hat, Inc.
3
* by Peter Jones <
[email protected]
>
4
* Copyright 2007 IBM, Inc.
5
* by Konrad Rzeszutek <
[email protected]
>
6
* Copyright 2008
7
* by Konrad Rzeszutek <
[email protected]
>
8
*
9
* This code finds the iSCSI Boot Format Table.
10
*
11
* This program is free software; you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License v2.0 as published by
13
* the Free Software Foundation
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
19
*/
20
21
#include <
linux/bootmem.h
>
22
#include <
linux/blkdev.h
>
23
#include <linux/ctype.h>
24
#include <linux/device.h>
25
#include <
linux/efi.h
>
26
#include <
linux/err.h
>
27
#include <
linux/init.h
>
28
#include <
linux/limits.h
>
29
#include <linux/module.h>
30
#include <linux/pci.h>
31
#include <linux/stat.h>
32
#include <linux/string.h>
33
#include <linux/types.h>
34
#include <
linux/acpi.h
>
35
#include <
linux/iscsi_ibft.h
>
36
37
#include <asm/mmzone.h>
38
39
/*
40
* Physical location of iSCSI Boot Format Table.
41
*/
42
struct
acpi_table_ibft
*
ibft_addr
;
43
EXPORT_SYMBOL_GPL
(ibft_addr);
44
45
static
const
struct
{
46
char
*
sign
;
47
} ibft_signs[] = {
48
{
"iBFT"
},
49
{
"BIFT"
},
/* Broadcom iSCSI Offload */
50
};
51
52
#define IBFT_SIGN_LEN 4
53
#define IBFT_START 0x80000
/* 512kB */
54
#define IBFT_END 0x100000
/* 1MB */
55
#define VGA_MEM 0xA0000
/* VGA buffer */
56
#define VGA_SIZE 0x20000
/* 128kB */
57
58
static
int
__init
find_ibft_in_mem(
void
)
59
{
60
unsigned
long
pos
;
61
unsigned
int
len
= 0;
62
void
*virt;
63
int
i
;
64
65
for
(pos =
IBFT_START
; pos <
IBFT_END
; pos += 16) {
66
/* The table can't be inside the VGA BIOS reserved space,
67
* so skip that area */
68
if
(pos ==
VGA_MEM
)
69
pos +=
VGA_SIZE
;
70
virt =
isa_bus_to_virt
(pos);
71
72
for
(i = 0; i <
ARRAY_SIZE
(ibft_signs); i++) {
73
if
(
memcmp
(virt, ibft_signs[i].
sign
,
IBFT_SIGN_LEN
) ==
74
0) {
75
unsigned
long
*
addr
=
76
(
unsigned
long
*)
isa_bus_to_virt
(pos + 4);
77
len = *
addr
;
78
/* if the length of the table extends past 1M,
79
* the table cannot be valid. */
80
if
(pos + len <= (IBFT_END-1)) {
81
ibft_addr = (
struct
acpi_table_ibft
*)virt;
82
pr_info
(
"iBFT found at 0x%lx.\n"
, pos);
83
goto
done
;
84
}
85
}
86
}
87
}
88
done
:
89
return
len;
90
}
91
/*
92
* Routine used to find the iSCSI Boot Format Table. The logical
93
* kernel address is set in the ibft_addr global variable.
94
*/
95
unsigned
long
__init
find_ibft_region
(
unsigned
long
*sizep)
96
{
97
ibft_addr =
NULL
;
98
99
/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
100
* only use ACPI for this */
101
102
if
(!
efi_enabled
)
103
find_ibft_in_mem();
104
105
if
(ibft_addr) {
106
*sizep =
PAGE_ALIGN
(ibft_addr->
header
.length);
107
return
(
u64
)isa_virt_to_bus(ibft_addr);
108
}
109
110
*sizep = 0;
111
return
0;
112
}
Generated on Thu Jan 10 2013 13:30:33 for Linux Kernel by
1.8.2