~ubuntu-branches/ubuntu/saucy/seabios/saucy-proposed

« back to all changes in this revision

Viewing changes to src/coreboot.c

  • Committer: Package Import Robot
  • Author(s): Michael Tokarev
  • Date: 2013-07-08 21:34:44 UTC
  • mfrom: (1.1.7)
  • Revision ID: package-import@ubuntu.com-20130708213444-6ed9q23j39x143lu
Tags: 1.7.3-1
Multi-Arch: allowed

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#include "boot.h" // boot_add_cbfs
13
13
#include "disk.h" // MAXDESCSIZE
14
14
#include "config.h" // CONFIG_*
 
15
#include "acpi.h" // find_acpi_features
 
16
#include "pci.h" // pci_probe_devices
 
17
#include "paravirt.h" // PlatformRunningOn
15
18
 
16
19
 
17
20
/****************************************************************
123
126
 
124
127
// Populate max ram and e820 map info by scanning for a coreboot table.
125
128
void
126
 
coreboot_setup(void)
 
129
coreboot_preinit(void)
127
130
{
 
131
    if (!CONFIG_COREBOOT)
 
132
        return;
 
133
 
128
134
    dprintf(3, "Attempting to find coreboot table\n");
129
135
 
130
136
    // Find coreboot table.
143
149
    if (!cbm)
144
150
        goto fail;
145
151
 
146
 
    u64 maxram = 0, maxram_over4G = 0;
147
152
    int i, count = MEM_RANGE_COUNT(cbm);
148
153
    for (i=0; i<count; i++) {
149
154
        struct cb_memory_range *m = &cbm->map[i];
150
155
        u32 type = m->type;
151
 
        if (type == CB_MEM_TABLE) {
 
156
        if (type == CB_MEM_TABLE)
152
157
            type = E820_RESERVED;
153
 
        } else if (type == E820_ACPI || type == E820_RAM) {
154
 
            u64 end = m->start + m->size;
155
 
            if (end > 0x100000000ull) {
156
 
                end -= 0x100000000ull;
157
 
                if (end > maxram_over4G)
158
 
                    maxram_over4G = end;
159
 
            } else if (end > maxram)
160
 
                maxram = end;
161
 
        }
162
158
        add_e820(m->start, m->size, type);
163
159
    }
164
160
 
165
 
    RamSize = maxram;
166
 
    RamSizeOver4G = maxram_over4G;
167
 
 
168
161
    // Ughh - coreboot likes to set a map at 0x0000-0x1000, but this
169
162
    // confuses grub.  So, override it.
170
163
    add_e820(0, 16*1024, E820_RAM);
173
166
    if (cbmb) {
174
167
        CBvendor = &cbmb->strings[cbmb->vendor_idx];
175
168
        CBpart = &cbmb->strings[cbmb->part_idx];
 
169
        if (strcmp(CBvendor, "Emulation") == 0 &&
 
170
            memcmp(CBpart, "QEMU", 4) == 0) {
 
171
            PlatformRunningOn |= PF_QEMU;
 
172
        }
176
173
        dprintf(1, "Found mainboard %s %s\n", CBvendor, CBpart);
177
174
    }
178
175
 
181
178
fail:
182
179
    // No table found..  Use 16Megs as a dummy value.
183
180
    dprintf(1, "Unable to find coreboot table!\n");
184
 
    RamSize = 16*1024*1024;
185
 
    RamSizeOver4G = 0;
186
181
    add_e820(0, 16*1024*1024, E820_RAM);
187
182
    return;
188
183
}
204
199
}
205
200
 
206
201
void
207
 
coreboot_copy_biostable(void)
 
202
coreboot_platform_setup(void)
208
203
{
 
204
    if (!CONFIG_COREBOOT)
 
205
        return;
 
206
    pci_probe_devices();
 
207
 
209
208
    struct cb_memory *cbm = CBMemTable;
210
 
    if (! CONFIG_COREBOOT || !cbm)
 
209
    if (!cbm)
211
210
        return;
212
211
 
213
212
    dprintf(3, "Relocating coreboot bios tables\n");
219
218
        if (m->type == CB_MEM_TABLE)
220
219
            scan_tables(m->start, m->size);
221
220
    }
 
221
 
 
222
    find_acpi_features();
222
223
}
223
224
 
224
225
 
290
291
    char filename[0];
291
292
} PACKED;
292
293
 
 
294
struct cbfs_romfile_s {
 
295
    struct romfile_s file;
 
296
    struct cbfs_file *fhdr;
 
297
    void *data;
 
298
    u32 rawsize, flags;
 
299
};
 
300
 
293
301
// Copy a file to memory (uncompressing if necessary)
294
302
static int
295
303
cbfs_copyfile(struct romfile_s *file, void *dst, u32 maxlen)
296
304
{
297
 
    if (!CONFIG_COREBOOT || !CONFIG_COREBOOT_FLASH)
 
305
    if (!CONFIG_COREBOOT_FLASH)
298
306
        return -1;
299
307
 
300
 
    u32 size = file->rawsize;
301
 
    void *src = file->data;
302
 
    if (file->flags) {
 
308
    struct cbfs_romfile_s *cfile;
 
309
    cfile = container_of(file, struct cbfs_romfile_s, file);
 
310
    u32 size = cfile->rawsize;
 
311
    void *src = cfile->data;
 
312
    if (cfile->flags) {
303
313
        // Compressed - copy to temp ram and uncompress it.
304
314
        void *temp = malloc_tmphigh(size);
305
315
        if (!temp) {
324
334
}
325
335
 
326
336
void
327
 
coreboot_cbfs_setup(void)
 
337
coreboot_cbfs_init(void)
328
338
{
329
 
    if (!CONFIG_COREBOOT || !CONFIG_COREBOOT_FLASH)
 
339
    if (!CONFIG_COREBOOT_FLASH)
330
340
        return;
331
341
 
332
342
    struct cbfs_header *hdr = *(void **)CBFS_HEADPTR_ADDR;
337
347
    }
338
348
    dprintf(1, "Found CBFS header at %p\n", hdr);
339
349
 
340
 
    struct cbfs_file *cfile = (void *)(0 - be32_to_cpu(hdr->romsize)
341
 
                                       + be32_to_cpu(hdr->offset));
 
350
    struct cbfs_file *fhdr = (void *)(0 - be32_to_cpu(hdr->romsize)
 
351
                                      + be32_to_cpu(hdr->offset));
342
352
    for (;;) {
343
 
        if (cfile < (struct cbfs_file *)(0xFFFFFFFF - be32_to_cpu(hdr->romsize)))
 
353
        if (fhdr < (struct cbfs_file *)(0xFFFFFFFF - be32_to_cpu(hdr->romsize)))
344
354
            break;
345
 
        u64 magic = cfile->magic;
 
355
        u64 magic = fhdr->magic;
346
356
        if (magic != CBFS_FILE_MAGIC)
347
357
            break;
348
 
        struct romfile_s *file = malloc_tmp(sizeof(*file));
349
 
        if (!file) {
 
358
        struct cbfs_romfile_s *cfile = malloc_tmp(sizeof(*cfile));
 
359
        if (!cfile) {
350
360
            warn_noalloc();
351
361
            break;
352
362
        }
353
 
        memset(file, 0, sizeof(*file));
354
 
        strtcpy(file->name, cfile->filename, sizeof(file->name));
355
 
        dprintf(3, "Found CBFS file: %s\n", file->name);
356
 
        file->size = file->rawsize = be32_to_cpu(cfile->len);
357
 
        file->id = (u32)cfile;
358
 
        file->copy = cbfs_copyfile;
359
 
        file->data = (void*)cfile + be32_to_cpu(cfile->offset);
360
 
        int len = strlen(file->name);
361
 
        if (len > 5 && strcmp(&file->name[len-5], ".lzma") == 0) {
 
363
        memset(cfile, 0, sizeof(*cfile));
 
364
        strtcpy(cfile->file.name, fhdr->filename, sizeof(cfile->file.name));
 
365
        cfile->file.size = cfile->rawsize = be32_to_cpu(fhdr->len);
 
366
        cfile->fhdr = fhdr;
 
367
        cfile->file.copy = cbfs_copyfile;
 
368
        cfile->data = (void*)fhdr + be32_to_cpu(fhdr->offset);
 
369
        int len = strlen(cfile->file.name);
 
370
        if (len > 5 && strcmp(&cfile->file.name[len-5], ".lzma") == 0) {
362
371
            // Using compression.
363
 
            file->flags = 1;
364
 
            file->name[len-5] = '\0';
365
 
            file->size = *(u32*)(file->data + LZMA_PROPERTIES_SIZE);
 
372
            cfile->flags = 1;
 
373
            cfile->file.name[len-5] = '\0';
 
374
            cfile->file.size = *(u32*)(cfile->data + LZMA_PROPERTIES_SIZE);
366
375
        }
367
 
        romfile_add(file);
 
376
        romfile_add(&cfile->file);
368
377
 
369
 
        cfile = (void*)ALIGN((u32)file->data + file->size, be32_to_cpu(hdr->align));
 
378
        fhdr = (void*)ALIGN((u32)cfile->data + cfile->file.size
 
379
                            , be32_to_cpu(hdr->align));
370
380
    }
371
381
}
372
382
 
390
400
};
391
401
 
392
402
void
393
 
cbfs_run_payload(struct cbfs_file *file)
 
403
cbfs_run_payload(struct cbfs_file *fhdr)
394
404
{
395
 
    if (!CONFIG_COREBOOT || !CONFIG_COREBOOT_FLASH || !file)
 
405
    if (!CONFIG_COREBOOT_FLASH || !fhdr)
396
406
        return;
397
 
    dprintf(1, "Run %s\n", file->filename);
398
 
    struct cbfs_payload *pay = (void*)file + be32_to_cpu(file->offset);
 
407
    dprintf(1, "Run %s\n", fhdr->filename);
 
408
    struct cbfs_payload *pay = (void*)fhdr + be32_to_cpu(fhdr->offset);
399
409
    struct cbfs_payload_segment *seg = pay->segments;
400
410
    for (;;) {
401
411
        void *src = (void*)pay + be32_to_cpu(seg->offset);
443
453
void
444
454
cbfs_payload_setup(void)
445
455
{
446
 
    if (!CONFIG_COREBOOT || !CONFIG_COREBOOT_FLASH)
 
456
    if (!CONFIG_COREBOOT_FLASH)
447
457
        return;
448
458
    struct romfile_s *file = NULL;
449
459
    for (;;) {
450
460
        file = romfile_findprefix("img/", file);
451
461
        if (!file)
452
462
            break;
 
463
        struct cbfs_romfile_s *cfile;
 
464
        cfile = container_of(file, struct cbfs_romfile_s, file);
453
465
        const char *filename = file->name;
454
466
        char *desc = znprintf(MAXDESCSIZE, "Payload [%s]", &filename[4]);
455
 
        boot_add_cbfs((void*)file->id, desc
456
 
                      , bootprio_find_named_rom(filename, 0));
 
467
        boot_add_cbfs(cfile->fhdr, desc, bootprio_find_named_rom(filename, 0));
457
468
    }
458
469
}