Skip to content

Commit 71bb38f

Browse files
committed
Implemented native FPGA flashing
Removed dependency to OPAE libraries
1 parent 04be52e commit 71bb38f

File tree

13 files changed

+796
-492
lines changed

13 files changed

+796
-492
lines changed

cmd/fpga_crihook/main.go

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
"strings"
2424

2525
"github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpga/bitstream"
26-
"github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpga/device"
26+
fpga "github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpga/linux"
2727
"github.com/pkg/errors"
2828
utilsexec "k8s.io/utils/exec"
2929
)
@@ -144,10 +144,10 @@ func (he *hookEnv) getFPGAParams(config *Config) ([]fpgaParams, error) {
144144
splitted := strings.SplitN(env, "=", 2)
145145
if strings.HasPrefix(splitted[0], fpgaRegionEnvPrefix) {
146146
num := strings.Split(splitted[0], fpgaRegionEnvPrefix)[1]
147-
regionEnv[num] = device.CanonizeID(splitted[1])
147+
regionEnv[num] = fpga.CanonizeID(splitted[1])
148148
} else if strings.HasPrefix(splitted[0], fpgaAfuEnvPrefix) {
149149
num := strings.Split(splitted[0], fpgaAfuEnvPrefix)[1]
150-
afuEnv[num] = device.CanonizeID(splitted[1])
150+
afuEnv[num] = fpga.CanonizeID(splitted[1])
151151
}
152152
}
153153

@@ -175,24 +175,23 @@ func (he *hookEnv) getFPGAParams(config *Config) ([]fpgaParams, error) {
175175
for _, dev := range config.Linux.Devices {
176176
deviceName := dev.getName()
177177
// skip non-FPGA devices
178-
if !device.IsFPGADevice(deviceName) {
178+
if !fpga.IsFpgaPort(deviceName) {
179179
continue
180180
}
181181

182182
// skip already processed devices
183183
if dev.processed {
184184
continue
185185
}
186-
fme, err := device.GetFMEDevice(he.sysFsPrefix, deviceName)
186+
port, err := fpga.NewFpgaPort(deviceName)
187187
if err != nil {
188188
return nil, err
189189
}
190-
191-
if fme.ID == region {
190+
if interfaceUUID := port.GetInterfaceUUID(); interfaceUUID == region {
192191
params = append(params,
193192
fpgaParams{
194193
afu: afu,
195-
region: fme.ID,
194+
region: interfaceUUID,
196195
portDevice: deviceName,
197196
},
198197
)
@@ -253,12 +252,13 @@ func (he *hookEnv) process(reader io.Reader) error {
253252
}
254253

255254
for _, params := range paramslist {
256-
programmedAfu, err := device.GetAFUDevice(he.sysFsPrefix, params.portDevice)
255+
port, err := fpga.NewFpgaPort(params.portDevice)
257256
if err != nil {
258257
return err
259258
}
260259

261-
if programmedAfu.ID == params.afu {
260+
programmedAfu := port.GetAcceleratorTypeUUID()
261+
if programmedAfu == params.afu {
262262
// Afu is already programmed
263263
return nil
264264
}
@@ -267,34 +267,14 @@ func (he *hookEnv) process(reader io.Reader) error {
267267
if err != nil {
268268
return err
269269
}
270+
defer bitstream.Close()
270271

271-
err = bitstream.Init()
272-
if err != nil {
273-
return err
274-
}
275-
276-
err = bitstream.Validate(params.region, params.afu)
277-
if err != nil {
278-
return err
279-
}
272+
err = port.PR(bitstream, false)
280273

281-
fme, err := device.GetFMEDevice(he.sysFsPrefix, params.portDevice)
282-
if err != nil {
283-
return err
284-
}
285-
286-
err = bitstream.Program(fme, he.execer)
287-
if err != nil {
288-
return err
289-
}
290-
291-
programmedAfu, err = device.GetAFUDevice(he.sysFsPrefix, params.portDevice)
292-
if err != nil {
293-
return err
294-
}
274+
programmedAfu = port.GetAcceleratorTypeUUID()
295275

296-
if programmedAfu.ID != params.afu {
297-
return errors.Errorf("programmed function %s instead of %s", programmedAfu.ID, params.afu)
276+
if programmedAfu != bitstream.AcceleratorTypeUUID() {
277+
return errors.Errorf("programmed function %s instead of %s", programmedAfu, bitstream.AcceleratorTypeUUID())
298278
}
299279
}
300280

cmd/fpga_tool/fpga_tool.go

Lines changed: 33 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@ import (
2121
"log"
2222
"os"
2323
"path/filepath"
24-
"strings"
2524

2625
"github.com/pkg/errors"
2726

2827
"github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpga/bitstream"
29-
"github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpga/device"
3028
fpga "github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpga/linux"
3129
)
3230

@@ -106,16 +104,7 @@ func validateFlags(cmd, bitstream, device string) error {
106104

107105
// WIP testing command
108106
func magic(dev string) (err error) {
109-
d, err := device.GetFMEDevice("", dev)
110-
fmt.Printf("%+v %+v\n", d, err)
111-
112-
d1, err := fpga.FindSysFsDevice(dev)
113-
fmt.Printf("%+v %+v\n", d1, err)
114-
if err != nil {
115-
return
116-
}
117-
d2, err := fpga.NewPCIDevice(d1)
118-
fmt.Printf("%+v %+v\n", d2, err)
107+
fmt.Println(fpga.ListFpgaDevices())
119108
return
120109
}
121110

@@ -153,9 +142,9 @@ func installBitstream(fname string, dryRun bool) (err error) {
153142

154143
func fpgaInfo(fname string) error {
155144
switch {
156-
case strings.HasPrefix(fname, "/dev/dfl-fme."), strings.HasPrefix(fname, "/dev/intel-fpga-fme."):
145+
case fpga.IsFpgaFME(fname):
157146
return fmeInfo(fname)
158-
case strings.HasPrefix(fname, "/dev/dfl-port."), strings.HasPrefix(fname, "/dev/intel-fpga-port."):
147+
case fpga.IsFpgaPort(fname):
159148
return portInfo(fname)
160149
}
161150
return errors.Errorf("unknown FPGA device file %s", fname)
@@ -185,14 +174,7 @@ func printBitstreamInfo(fname string) (err error) {
185174
func fmeInfo(fname string) error {
186175
var f fpga.FpgaFME
187176
var err error
188-
switch {
189-
case strings.HasPrefix(fname, "/dev/dfl-fme."):
190-
f, err = fpga.NewDflFME(fname)
191-
case strings.HasPrefix(fname, "/dev/intel-fpga-fme."):
192-
f, err = fpga.NewIntelFpgaFME(fname)
193-
default:
194-
return errors.Errorf("unknow type of FME %s", fname)
195-
}
177+
f, err = fpga.NewFpgaFME(fname)
196178
if err != nil {
197179
return err
198180
}
@@ -201,20 +183,21 @@ func fmeInfo(fname string) error {
201183
fmt.Println(f.GetAPIVersion())
202184
fmt.Print("CheckExtension:")
203185
fmt.Println(f.CheckExtension())
186+
187+
fmt.Println("GetDevPath: ", f.GetDevPath())
188+
fmt.Println("GetSysFsPath: ", f.GetSysFsPath())
189+
fmt.Println("GetName: ", f.GetName())
190+
pci, err := f.GetPCIDevice()
191+
fmt.Printf("GetPCIDevice: %+v %+v\n", pci, err)
192+
fmt.Println("GetInterfaceUUID: ", f.GetInterfaceUUID())
193+
fmt.Println("GetPortNums: ", f.GetPortsNum())
204194
return nil
205195
}
206196

207197
func portInfo(fname string) error {
208198
var f fpga.FpgaPort
209199
var err error
210-
switch {
211-
case strings.HasPrefix(fname, "/dev/dfl-port."):
212-
f, err = fpga.NewDflPort(fname)
213-
case strings.HasPrefix(fname, "/dev/intel-fpga-port."):
214-
f, err = fpga.NewIntelFpgaPort(fname)
215-
default:
216-
err = errors.Errorf("unknown type of port %s", fname)
217-
}
200+
f, err = fpga.NewFpgaPort(fname)
218201
if err != nil {
219202
return err
220203
}
@@ -234,42 +217,38 @@ func portInfo(fname string) error {
234217
fmt.Println(f.PortGetRegionInfo(uint32(idx)))
235218
}
236219
}
220+
221+
fmt.Println("GetDevPath: ", f.GetDevPath())
222+
fmt.Println("GetSysFsPath: ", f.GetSysFsPath())
223+
fmt.Println("GetName: ", f.GetName())
224+
pci, err := f.GetPCIDevice()
225+
fmt.Printf("GetPCIDevice: %+v %+v\n", pci, err)
226+
id, err := f.GetPortID()
227+
fmt.Printf("GetPort: %+v %+v\n", id, err)
228+
fmt.Println("GetAcceleratorTypeUUID: ", f.GetAcceleratorTypeUUID())
229+
fmt.Println("GetInterfaceUUID: ", f.GetInterfaceUUID())
230+
fme, err := f.GetFME()
231+
fmt.Printf("GetFME: %+v %+v\n", fme, err)
232+
237233
return nil
238234
}
239235

240-
func doPR(fme, bs string, dryRun bool) error {
241-
var f fpga.FpgaFME
242-
var err error
243-
switch {
244-
case strings.HasPrefix(fme, "/dev/dfl-fme."):
245-
f, err = fpga.NewDflFME(fme)
246-
case strings.HasPrefix(fme, "/dev/intel-fpga-fme."):
247-
f, err = fpga.NewIntelFpgaFME(fme)
248-
default:
249-
return errors.Errorf("unknown FME %s", fme)
250-
}
251-
fmt.Printf("Trying to program %s to port 0 of %s", bs, fme)
236+
func doPR(dev, bs string, dryRun bool) error {
237+
238+
f, err := fpga.NewFpgaPort(dev)
252239
if err != nil {
253240
return err
254241
}
255242
defer f.Close()
256-
fmt.Print("API:")
257-
fmt.Println(f.GetAPIVersion())
258243
m, err := bitstream.Open(bs)
259244
if err != nil {
260245
return err
261246
}
262247
defer m.Close()
263248

264-
rawBistream, err := m.RawBitstreamData()
265-
if err != nil {
266-
return err
267-
}
268-
if dryRun {
269-
fmt.Println("Dry-Run: Skipping actual programming")
270-
return nil
271-
}
272-
fmt.Print("Trying to PR, brace yourself! :")
273-
fmt.Println(f.PortPR(0, rawBistream))
249+
fmt.Printf("Before programming I %q A %q\n", f.GetInterfaceUUID(), f.GetAcceleratorTypeUUID())
250+
fmt.Printf("Trying to program %s to port %s: ", bs, dev)
251+
fmt.Println(f.PR(m, dryRun))
252+
fmt.Printf("After programming I %q A %q\n", f.GetInterfaceUUID(), f.GetAcceleratorTypeUUID())
274253
return nil
275254
}

pkg/fpga/bitstream/aocx.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"os"
2424
"path/filepath"
2525
"strconv"
26+
"strings"
2627

2728
"github.com/pkg/errors"
2829
)
@@ -113,7 +114,7 @@ func setSection(f *FileAOCX, section *elf.Section) error {
113114
if err != nil {
114115
return errors.Wrapf(err, "%s: unable to get section data", name)
115116
}
116-
*field = string(data)
117+
*field = strings.TrimSpace(string(data))
117118
}
118119
return nil
119120
}

0 commit comments

Comments
 (0)