~ubuntu-branches/ubuntu/trusty/linux-lts-xenial/trusty-proposed

« back to all changes in this revision

Viewing changes to drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c

  • Committer: Package Import Robot
  • Author(s): Tim Gardner
  • Date: 2016-03-08 13:26:08 UTC
  • Revision ID: package-import@ubuntu.com-20160308132608-hxh0frngo4vaiqw7
Tags: 4.4.0-12.28~14.04.1
* Miscellaneous Ubuntu changes
  - reconstruct: Work around orig tarball packaging limitiations
    Fixes FTBS

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
 * BIOS.
36
36
 */
37
37
 
 
38
#define AMD_VBIOS_SIGNATURE " 761295520"
 
39
#define AMD_VBIOS_SIGNATURE_OFFSET 0x30
 
40
#define AMD_VBIOS_SIGNATURE_SIZE sizeof(AMD_VBIOS_SIGNATURE)
 
41
#define AMD_VBIOS_SIGNATURE_END (AMD_VBIOS_SIGNATURE_OFFSET + AMD_VBIOS_SIGNATURE_SIZE)
 
42
#define AMD_IS_VALID_VBIOS(p) ((p)[0] == 0x55 && (p)[1] == 0xAA)
 
43
#define AMD_VBIOS_LENGTH(p) ((p)[2] << 9)
 
44
 
38
45
/* If you boot an IGP board with a discrete card as the primary,
39
46
 * the IGP rom is not accessible via the rom bar as the IGP rom is
40
47
 * part of the system bios.  On boot, the system bios puts a
58
65
                return false;
59
66
        }
60
67
 
61
 
        if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) {
 
68
        if (size == 0 || !AMD_IS_VALID_VBIOS(bios)) {
62
69
                iounmap(bios);
63
70
                return false;
64
71
        }
74
81
 
75
82
bool amdgpu_read_bios(struct amdgpu_device *adev)
76
83
{
77
 
        uint8_t __iomem *bios, val1, val2;
 
84
        uint8_t __iomem *bios, val[2];
78
85
        size_t size;
79
86
 
80
87
        adev->bios = NULL;
84
91
                return false;
85
92
        }
86
93
 
87
 
        val1 = readb(&bios[0]);
88
 
        val2 = readb(&bios[1]);
 
94
        val[0] = readb(&bios[0]);
 
95
        val[1] = readb(&bios[1]);
89
96
 
90
 
        if (size == 0 || val1 != 0x55 || val2 != 0xaa) {
 
97
        if (size == 0 || !AMD_IS_VALID_VBIOS(val)) {
91
98
                pci_unmap_rom(adev->pdev, bios);
92
99
                return false;
93
100
        }
101
108
        return true;
102
109
}
103
110
 
 
111
static bool amdgpu_read_bios_from_rom(struct amdgpu_device *adev)
 
112
{
 
113
        u8 header[AMD_VBIOS_SIGNATURE_END+1] = {0};
 
114
        int len;
 
115
 
 
116
        if (!adev->asic_funcs->read_bios_from_rom)
 
117
                return false;
 
118
 
 
119
        /* validate VBIOS signature */
 
120
        if (amdgpu_asic_read_bios_from_rom(adev, &header[0], sizeof(header)) == false)
 
121
                return false;
 
122
        header[AMD_VBIOS_SIGNATURE_END] = 0;
 
123
 
 
124
        if ((!AMD_IS_VALID_VBIOS(header)) ||
 
125
            0 != memcmp((char *)&header[AMD_VBIOS_SIGNATURE_OFFSET],
 
126
                        AMD_VBIOS_SIGNATURE,
 
127
                        strlen(AMD_VBIOS_SIGNATURE)))
 
128
                return false;
 
129
 
 
130
        /* valid vbios, go on */
 
131
        len = AMD_VBIOS_LENGTH(header);
 
132
        len = ALIGN(len, 4);
 
133
        adev->bios = kmalloc(len, GFP_KERNEL);
 
134
        if (!adev->bios) {
 
135
                DRM_ERROR("no memory to allocate for BIOS\n");
 
136
                return false;
 
137
        }
 
138
 
 
139
        /* read complete BIOS */
 
140
        return amdgpu_asic_read_bios_from_rom(adev, adev->bios, len);
 
141
}
 
142
 
104
143
static bool amdgpu_read_platform_bios(struct amdgpu_device *adev)
105
144
{
106
145
        uint8_t __iomem *bios;
113
152
                return false;
114
153
        }
115
154
 
116
 
        if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) {
 
155
        if (size == 0 || !AMD_IS_VALID_VBIOS(bios)) {
117
156
                return false;
118
157
        }
119
158
        adev->bios = kmemdup(bios, size, GFP_KERNEL);
230
269
                        break;
231
270
        }
232
271
 
233
 
        if (i == 0 || adev->bios[0] != 0x55 || adev->bios[1] != 0xaa) {
 
272
        if (i == 0 || !AMD_IS_VALID_VBIOS(adev->bios)) {
234
273
                kfree(adev->bios);
235
274
                return false;
236
275
        }
320
359
        if (r == false)
321
360
                r = amdgpu_read_bios(adev);
322
361
        if (r == false) {
 
362
                r = amdgpu_read_bios_from_rom(adev);
 
363
        }
 
364
        if (r == false) {
323
365
                r = amdgpu_read_disabled_bios(adev);
324
366
        }
325
367
        if (r == false) {
330
372
                adev->bios = NULL;
331
373
                return false;
332
374
        }
333
 
        if (adev->bios[0] != 0x55 || adev->bios[1] != 0xaa) {
 
375
        if (!AMD_IS_VALID_VBIOS(adev->bios)) {
334
376
                printk("BIOS signature incorrect %x %x\n", adev->bios[0], adev->bios[1]);
335
377
                goto free_bios;
336
378
        }