[coreboot] [ patch] v3 Geode graphics init.

Marc Jones Marc.Jones at AMD.com
Thu Feb 21 17:29:36 CET 2008


Carl-Daniel Hailfinger wrote:
> On 21.02.2008 02:54, Marc Jones wrote:
>>
>>
>> Carl-Daniel Hailfinger wrote:
>>> On 21.02.2008 01:09, Marc Jones wrote:
>>>> This patch assumes the vsa/idt patch is in place.
>>> Comments inline.
>>>
>>>> Removed CONFIG_VIDE0_MB in Kconfig and set the Geode
>>>> graphics memory size through the Geode northbridge pci dts.
>>>> This is a better way to handle a cpu/mainboard specific value.
>>>>
>>>> Signed-off-by: Marc Jones <marc.jones at amd.com>
>>>>
>>>> Index: coreboot-v3/northbridge/amd/geodelx/geodelx.c
>>>> ===================================================================
>>>> --- coreboot-v3.orig/northbridge/amd/geodelx/geodelx.c    
>>>> 2008-02-20 10:07:27.000000000 -0700
>>
>>>> +extern void graphics_init(struct 
>>>> northbridge_amd_geodelx_pci_config *nb_pci);
>>>> +extern int sizeram(void);
>>>
>>> Do we want sizeram() as a function on all subarches? If yes, we have
>>> to either call it something like sizeram_4G() or we have to change the
>>> return type to u64.
>>>
>>
>> I don't know if any other subarchs will implement this but I like the 
>> idea. I will make it u64.
>
> Great. Please do note that I forgot to mention the somewhat grim 
> reality of 64bit machines with more than 4 GB of RAM where we have two 
> different notions of top of RAM: The address where the 32bit hardware 
> decoded space begins and the real top of RAM, which is not equal to 
> the size of installed RAM due to the hole below 4 GB.
>
>
Right, this will give you the size of RAM in this case for Geode. Other 
architectures would have to do the right thing.
>> ...
>>
>>
>>>> @@ -127,7 +162,7 @@
>>>>          ram_resource(dev, idx++, 0, 640);
>>>>          /* 1 MB .. (Systop - 1 MB) (converted to KB) */
>>>
>>> You subtract only 1 MB here.
>
> My comment above referred to your comment above in conjunction with 
> your code below.
>
>
>>>>          ram_resource(dev, idx++, 1024,
>>>> -                 (get_systop() - (1 * 1024 * 1024)) / 1024);
>>>> +                 (get_systop(nb_pci) - (1 * 1024 * 1024)) / 1024);
>>>>      }
>>>>   
>>
>> As the comment say. 0-640K is claimed prior to the 1MB to systop.
>
> Sorry, I still don't understand although I'm really trying hard. Maybe 
> my comment was misplaced and thus misunderstood.
> The first ram_resource claims 0 - 640k.
> The second ram_resource claims 1M - (systop-1M). Where's that 
> hardcoded missing 1 MB at the top of RAM going?
>
>
systop-1M is the size.
static void ram_resource(device_t dev, unsigned long index,
             unsigned long basek, unsigned long sizek)


>>>> +
>>>> +    /* SoftVG initialization */
>>>
>>> That's scary. Do we really need VSA support even if there is a native
>>> geodelx framebuffer/X driver?
>>>
>> Not scary. Geode needs VSA for the PCI headers. VSA needs to know how 
>> much memory is claimed to report it in the BAR.
>
> Thanks for the info.
>
>> ...
>>
>>>> +    /*
>>>> +     * Graphics Driver Enabled (13)            0, NO (lets BIOS 
>>>> controls the GP)
>>>> +     * External Monochrome Card Support(12)        0, NO
>>>> +     * Controller Priority Select(11)        1, Primary
>>>> +     * Display Select(10:8)                0x0, CRT
>>>> +     * Graphics Memory Size(7:1)            CONFIG_VIDEO_MB >> 1,
>>>> +     *    defined in mainboard/../dts
>>>> +     * PLL Reference Clock Bypass(0)        0, Default
>>>> +     */
>>>> +
>>>> +    /* Video RAM has to be given in 2MB chunks
>>>> +     *   the value is read @ 7:1 (value in 7:0 looks like /2)
>>>
>>> Typo?
>>>
>>> + * the value is read @ 7:1 (value in 7:0 looks like *2)
>>>
>>> Besides that, being limited to multiples of 2MB for VRAM seems not 
>>> to mix
>>> well with subtracting only 1MB from systop.
>>
>> Maybe that needs a better explanation. Bit 0 is used but video_mb is 
>> not shifted. Or you could look at it as video_mb/2 << 1.
>
> Suggestion:
> Value in 7:0 looks like (video_mb & ~1)
>
>
ok.
>> ...
>>
>>>> +#ifndef GEODELINK_H
>>>> +#define GEODELINK_H
>>>> +
>>>> +struct gliutable {
>>>> +    unsigned long desc_name;
>>>> +    unsigned short desc_type;
>>>> +    unsigned long hi, lo;
>>>> +};
>>>> +
>>>> +static struct gliutable gliu0table[] = {
>>>> +    /* 0-7FFFF to MC */
>>>> +    {.desc_name = MSR_GLIU0_BASE1,.desc_type = BM,.hi = MSR_MC + 0x0,
>>>> +     .lo = 0x0FFF80},
>>>> +    /* 80000-9FFFF to MC */
>>>> +    {.desc_name = MSR_GLIU0_BASE2,.desc_type = BM,.hi = MSR_MC + 0x0,
>>>> +     .lo = (0x80 << 20) + 0x0FFFE0},
>>>> +    /* C0000-FFFFF split to MC and PCI (sub decode) A0000-BFFFF
>>>> +     * handled by SoftVideo.
>>>> +     */
>>>> +    {.desc_name = MSR_GLIU0_SHADOW,.desc_type = SC_SHADOW,
>>>> +     .hi = MSR_MC + 0x0,.lo = 0x03},
>>>> +    /* Catch and fix dynamically. */
>>>> +    {.desc_name = MSR_GLIU0_SYSMEM,.desc_type = R_SYSMEM,
>>>> +     .hi = MSR_MC,.lo = 0x0},
>>>> +    /* Catch and fix dynamically. */
>>>> +    {.desc_name = MSR_GLIU0_SMM,.desc_type = BMO_SMM,
>>>> +     .hi = MSR_MC,.lo = 0x0},
>>>> +    {.desc_name = GLIU0_GLD_MSR_COH,.desc_type = OTHER,
>>>> +     .hi = 0x0,.lo = GL0_CPU},
>>>> +    {.desc_name = GL_END,.desc_type = GL_END,.hi = 0x0,.lo = 0x0},
>>>> +};
>>>> +
>>>> +static struct gliutable gliu1table[] = {
>>>> +    /* 0-7FFFF to MC */
>>>> +    {.desc_name = MSR_GLIU1_BASE1,.desc_type = BM,.hi = MSR_GL0 + 
>>>> 0x0,
>>>> +     .lo = 0x0FFF80},
>>>> +    /* 80000-9FFFF to MC */
>>>> +    {.desc_name = MSR_GLIU1_BASE2,.desc_type = BM,.hi = MSR_GL0 + 
>>>> 0x0,
>>>> +     .lo = (0x80 << 20) + 0x0FFFE0},
>>>> +    /* C0000-Fffff split to MC and PCI (sub decode) */
>>>> +    {.desc_name = MSR_GLIU1_SHADOW,.desc_type = SC_SHADOW,
>>>> +     .hi = MSR_GL0 + 0x0,.lo = 0x03},
>>>> +    /* Catch and fix dynamically. */
>>>> +    {.desc_name = MSR_GLIU1_SYSMEM,.desc_type = R_SYSMEM,
>>>> +     .hi = MSR_GL0,.lo = 0x0},
>>>> +    /* Catch and fix dynamically. */
>>>> +    {.desc_name = MSR_GLIU1_SMM,.desc_type = BM_SMM,
>>>> +     .hi = MSR_GL0,.lo = 0x0},
>>>> +    {.desc_name = GLIU1_GLD_MSR_COH,.desc_type = OTHER,
>>>> +     .hi = 0x0,.lo = GL1_GLIU0},
>>>> +    /* FooGlue FPU 0xF0 */
>>>> +    {.desc_name = MSR_GLIU1_FPU_TRAP,.desc_type = SCIO,
>>>> +     .hi = (GL1_GLCP << 29) + 0x0,.lo = 0x033000F0},
>>>> +    {.desc_name = GL_END,.desc_type = GL_END,.hi = 0x0,.lo = 0x0},
>>>> +};
>>>
>>> It's debatable whether gliu0table and gliu1table should really be in a
>>> header file as opposed to a normal .c code file. This max cause 
>>> additional
>>> warnings from gcc.
>>> If any of the tables are constant, please mark them as const.
>>
>> These need to be marked const. I will think about if this is the 
>> right way to do this.
>
> Thanks.
>
> One more complaint (probably a genuine bug):
>
>> +u32 get_systop(struct northbridge_amd_geodelx_pci_config *nb_pci)
>> +{
>> +    struct gliutable *gl = NULL;
>> +    u32 systop;
>> +    struct msr msr;
>> +    int i;
>> +
>> +    for (i = 0; gliu0table[i].desc_name != GL_END; i++) {
>> +        if (gliu0table[i].desc_type == R_SYSMEM) {
>> +            gl = &gliu0table[i];
>> +            break;
>> +        }
>> +    }
>> +    if (gl) {
>> +        msr = rdmsr(gl->desc_name);
>> +        systop = ((msr.hi & 0xFF) << 24) | ((msr.lo & 0xFFF00000) >> 
>> 8);
>> +        systop += 4 * 1024;    /* 4K */
>> +    } else {
>> +        systop =
>
> systop is the address of top of usable RAM in Bytes.
>
>> +            ((sizeram() - nb_pci->geode_video_mb) * 1024) - SMM_SIZE 
>> - 1024;
>
> sizeram() and geode_video_mb are in MBytes, yet they only get 
> multiplied by 1024.
> A factor of 1024 is missing here.

Real bug. Fortunately we never take that path. I will fix it in this 
patch for v3 and submit a patch for v2.

Thanks,
Marc

-- 
Marc Jones
Senior Firmware Engineer
(970) 226-9684 Office
mailto:Marc.Jones at amd.com
http://www.amd.com/embeddedprocessors 







More information about the coreboot mailing list